# AirOps MCP MCP Server > **AirOps MCP MCP Server** is a hosted, multitenant Model Context Protocol (MCP) server run by **MewCP** (https://mewcp.com), giving AI agents managed access to AirOps MCP. > > MewCP takes care of all MCP infrastructure for you — credential storage, OAuth flows, > token refresh, and production-grade auto-scaling — so your AI agents can connect to > third-party services and run freely without you managing any MCP server yourself. > > Server page: https://mewcp.com/mcp/airops-mcp > MewCP docs: https://docs.mewcp.com > Full catalog: https://mewcp.com/llms.txt --- ## About The AirOps MCP server brings AirOps Insights, Brand Kits, and Knowledge Bases into connected AI assistants. Query AI search intelligence, find opportunities, analyze competitors, create reports, manage brand context, and search proprietary sources through natural conversation. --- ## Details - Server ID: `airops-mcp` - Version: 1.0.0 - Tools: 98 - Authentication: OAuth, managed by MewCP - Transport: http --- ## Access The gateway URL below serves your **entire MewCP toolset**, not this server on its own. Pasting a config snippet is not enough — AirOps MCP has to be in the toolset first. In order: 1. Add AirOps MCP to your toolset at https://mewcp.com/mcp/airops-mcp 2. Connect your AirOps MCP account (OAuth); MewCP stores the credential and attaches it to each call 3. Copy your MewCP API key from the dashboard (Developer) 4. Configure your client with the snippet for it below Once connected, an agent does **not** see this server's tools as top-level tools. It sees four meta-tools and reaches everything through them: - `search(query)` — find tools by keyword across the toolset - `get_schema(tools)` — full description and arguments for the tools you picked - `list_accounts(provider)` — only when one app has several connected accounts - `call_tool(server_maskedId, tool_name, args)` — execute So the list below is what `search` can return for this server, not a set of callable tool names on their own. --- ## Tools (98) Descriptions are truncated to 160 characters; call `get_schema` for the full text and the argument schema. Where a tool is annotated, its type is shown — treat `destructive` as irreversible. - `add_aeo_region` _(write)_ — Add a region (ISO alpha-2 country code) to a Brand Kit's configured AEO regions. Why this tool exists: AEO prompts and prompt-assignments can only reference… - `get_aeo_ad` _(read)_ — Get one ad observed in ChatGPT answers. The 'id' parameter is the observed_creative_id returned by list_aeo_ads. - `list_aeo_ads` _(read)_ — List ads observed in ChatGPT answers for a Brand Kit. Ads observed by AirOps in collected ChatGPT answers. Rows are unique ads: observations sharing the same… - `list_reports` _(read)_ — List saved analytics reports for a specific Brand Kit. Reports are saved analytics views for a Brand Kit. They contain modules that display different analytics… - `get_report` _(read)_ — Get a specific report by ID with its module configurations. Reports are saved analytics views for a Brand Kit. They contain modules that display different… - `create_action_grid` _(write)_ — Create a grid pre-wired with power steps to take action on AEO insights. This is the ONLY supported way to run power steps from MCP: each action_type maps to a… - `list_aeo_advertisers` _(read)_ — List advertisers observed in ChatGPT answers for a Brand Kit. Advertisers observed by AirOps in collected ChatGPT answers. Rows roll up every observed ad to… - `list_aeo_page_content_updates` _(read)_ — List page content updates for a workspace. Track content updates. - `get_aeo_page_content_update` _(read)_ — Get a specific page content update by ID. Its change_detection object carries the detection status and categories, plus a nested changes array (the… - `track_aeo_page_content_update` _(write)_ — Track a page content update (publish/refresh) to correlate future analytics with content changes. Call this tool after a page is published or refreshed through… - `list_personas` _(read)_ — List personas for a specific Brand Kit. Personas are the characters that can be used to ask questions about a brand. They are used to get AI answers with… - `create_aeo_persona` _(write)_ — Create a new AEO persona on a Brand Kit. Personas represent the characters used to simulate AI-search queries when measuring AI visibility, citations, and… - `get_aeo_citation` _(read)_ — Get prompts citing a specific URL. The 'id' parameter is the URL to look up. - `list_aeo_citations` _(read)_ — List citations (URLs) with metrics for a Brand Kit. Citations (URLs) with detailed metrics including influence score. Shows individual URLs being cited in AI… - `list_aeo_domains` _(read)_ — List domains cited in AI answers for a Brand Kit. Cited domains aggregated by domain with citation metrics. Shows which domains are being cited in AI answers… - `bulk_update_aeo_prompt_tags` _(destructive)_ — Apply a single tag operation (add or remove) to a batch of AEO prompts in one Brand Kit, atomically. Operations: - `add` — adds the supplied tag_ids to each… - `analytics_chart` _(read)_ — Query analytics data and display it as an interactive chart. Returns data with a UI reference for visualization. Today's data is still being processed — always… - `query_analytics` _(read)_ — Query analytics data for a Brand Kit with flexible metrics, dimensions, and filters. Today's data is still being processed — always use yesterday (2026-09-21)… - `update_aeo_prompt_assignments` _(destructive)_ — Update the country, persona, and platform assignments of one or more existing AEO prompts on a Brand Kit. Writes to the brand kit's draft session ONLY —… - `commit_aeo_prompt_assignments` _(destructive)_ — Commit the current prompt-assignment draft for a Brand Kit to live. Replaces all live country, persona, and platform assignments for the brand kit's prompts… - `discard_aeo_prompt_assignments` _(destructive)_ — Discard the current prompt-assignment draft for a Brand Kit. Throws away ALL uncommitted edits — both your own and any unsaved edits the human user made in the… - `get_aeo_prompt_assignments_status` _(read)_ — Inspect the current prompt-assignment draft state for a Brand Kit without modifying anything. Read-only. This is the authoritative source for workspace… - `get_sentiment_theme_answers` _(read)_ — Get individual AI answers with sentiment details for a specific theme. Returns answer text, sentiment (positive/neutral/negative), confidence score, and… - `list_topics` _(read)_ — List topics for a specific Brand Kit. Topics are the categories of questions that can be asked about a Brand Kit. They are used to group questions together and… - `create_topic` _(write)_ — Create a new AEO topic on a Brand Kit. Topics are categories used to group AEO prompts. Behavior: - `name` must be unique within the Brand Kit. - `color` is… - `update_topic` _(write)_ — Update an existing AEO topic's name and/or color on a Brand Kit. Behavior: - At least one of `name` or `color` must be provided. - If `name` is provided, it… - `delete_topic` _(destructive)_ — Delete an AEO topic from a Brand Kit. Behavior: - This is a HARD delete. The topic is removed from the Brand Kit entirely. - Deletion is blocked when the topic… - `list_tags` _(read)_ — List tags for a specific Brand Kit. Tags are user-defined labels applied to prompts within a Brand Kit. They are typically used to filter analytics by… - `create_aeo_tag` _(write)_ — Create a new AEO tag on a Brand Kit. Tags are user-defined labels that can be applied to prompts via `bulk_update_aeo_prompt_tags`. Behavior: - `name` must be… - `update_aeo_tag` _(write)_ — Update an existing AEO tag's name and/or color on a Brand Kit. Behavior: - At least one of `name` or `color` must be provided. - If `name` is provided, it must… - `delete_aeo_tag` _(destructive)_ — Delete an AEO tag from a Brand Kit. Behavior: - This is a HARD delete. The tag is removed from the Brand Kit entirely. - All taggings on prompts that… - `list_aeo_prompts` _(read)_ — List AEO prompts for a specific Brand Kit. Questions are the AI prompts that can be asked about a brand. They are used to get AI answers with citations and… - `create_aeo_prompt` _(write)_ — Create a new AEO prompt for a Brand Kit. Prompts are questions that can be asked about a brand to AI search engines, used to track AI visibility and citations.… - `delete_aeo_prompt` _(destructive)_ — Delete an AEO prompt from a Brand Kit. Use `list_aeo_prompts` to find the prompt ID and verify the prompt text before deletion. IMPORTANT: This action is… - `bulk_update_aeo_prompt_topics` _(destructive)_ — Reassign a batch of AEO prompts to an existing topic in one Brand Kit. Specifying the destination topic: - Pass `topic_id` (use `list_topics` to discover… - `create_page` _(write)_ — Add a web page to a Brand Kit's AEO pages. The URL is normalized before the page is created, and the page is associated with the Brand Kit's configured AEO… - `list_campaigns` _(read)_ — List campaigns the authenticated user has access to. Use get_campaign to retrieve action grid IDs and custom instructions for a campaign. Campaigns are Plays… - `get_campaign` _(read)_ — Get a campaign by ID, including action grid IDs needed to inspect or update its grid. Campaigns are Plays that coordinate strategy playbooks, action grids, and… - `list_opportunities` _(read)_ — List opportunities for a campaign. V1 responses include matching opportunity items; v2 responses include parent review state, the target page, and ordered… - `create_opportunity` _(write)_ — Create one pending opportunity for a Campaign. In interactive Quill or OAuth sessions, summarize the proposed name, description, and target resources and get… - `accept_opportunity` _(write)_ — Accept pending opportunities for a campaign and add them to the campaign action grid. For v2 campaigns, pass opportunity_ids; acceptance uses the original… - `reject_opportunity` _(write)_ — Reject pending opportunities for a campaign. For v2 campaigns, pass opportunity_ids; opportunity item selection and rejection reasons are v1-only. Before… - `knowledge_base_create_direct_upload` _(write)_ — Initiate a direct file upload for a Knowledge Base. Returns a presigned S3 upload URL, the required upload headers, and a `signed_id` you'll use with… - `knowledge_base_delete_document` _(destructive)_ — Permanently delete a single document from a Knowledge Base. This action cannot be undone. IMPORTANT: Always warn the user that deletion is permanent and ask… - `knowledge_base_get_document` _(read)_ — Read the full reconstructed text content of a Knowledge Base document end-to-end — the loader-extracted text from every chunk concatenated in `position` order.… - `knowledge_base_get_status` _(read)_ — Get the indexing status of a Knowledge Base and its documents. Returns a Knowledge Base–level rollup (status, pending and total document counts) plus a… - `knowledge_base_manage` _(write)_ — Create or update a Knowledge Base. Omit `knowledge_base_id` to create a new one; pass it to update an existing one. On create, `name` is required; pass… - `knowledge_base_update_document_metadata` _(write)_ — Replace a document's user-facing metadata in full. Accepts a single-level hash that **replaces** (not merges) the existing user-facing metadata. To remove a… - `knowledge_base_delete` _(destructive)_ — Permanently delete a Knowledge Base and ALL of its documents. This cascades through every document in the KB and drops the underlying vectors. This action… - `search_knowledge_base` _(read)_ — Search a Knowledge Base for relevant content using semantic similarity. Use list_knowledge_bases() first to find available Knowledge Bases and their IDs. Only… - `list_knowledge_bases` _(read)_ — List all Knowledge Bases the authenticated user has access to. Knowledge Bases store documents for semantic search. Use the status field to determine if a… - `knowledge_base_add_file` _(write)_ — Step 2 of the two-step file ingestion flow for a Knowledge Base. Consumes a `signed_id` returned by `knowledge_base_create_direct_upload` (step 1) plus the… - `knowledge_base_add_urls` _(write)_ — Bulk-ingest one or more web pages into a Knowledge Base. Each URL becomes a separate document that fetches and indexes asynchronously. The call returns… - `list_brand_kits` _(read)_ — List all Brand Kits the user has access to. Returns `brand_management_enabled` and `aeo_enabled` flags for each brand kit. Use `get_brand_kit` for brand… - `get_brand_kit` _(read)_ — Fetch a Brand Kit's brand identity (writing_tone, writing_persona) and associated entities (product lines, audiences, content types, regions, writing rules,… - `manage_brand_kit_region` _(write)_ — Create or update a region for a Brand Kit. Omit `id` to create a new region; provide `id` to update an existing one. On update, only provided fields are… - `manage_brand_kit_custom_variable` _(write)_ — Before creating a custom variable, you MUST analyze the user's intent and suggest the appropriate Brand Kit dimension instead. Map the request to these… - `create_brand_kit_direct_upload` _(write)_ — Initiate a direct file upload for use with Brand Kit visual tools. This returns an upload URL (pointing directly to the storage service), upload headers, and a… - `get_insights_settings` _(read)_ — Get AEO insights configuration for a Brand Kit, this includes the relevant information to use any AEO and analytics tools. Returns competitors, personas,… - `publish_brand_kit` _(destructive)_ — Publish a Brand Kit's current draft so changes become active. This promotes the current draft to active and creates a fresh draft from it. IMPORTANT: Always… - `create_brand_kit_recap_entry` _(write)_ — Record a recap entry summarizing the changes you made to a Brand Kit. Call this once, near the end of a session that mutated the Brand Kit draft — not for… - `update_brand_kit` _(destructive)_ — Update a Brand Kit's base fields. Only provided fields are changed. Use get_brand_kit first to see current values. Updatable fields include brand identity… - `suggest_brand_kit_edits` _(read)_ — Suggest edits to a Brand Kit's fields without applying them. Returns a comparison of current vs suggested values for user review. The user will see a UI to… - `manage_brand_kit_competitor` _(destructive)_ — Create or update a competitor for a Brand Kit. Omit `id` to create a new competitor; provide `id` to update an existing one. On update, only provided fields… - `manage_brand_kit_content_sample` _(destructive)_ — Create or update a content sample for a Brand Kit. Omit `id` to create a new content sample; provide `id` to update an existing one. On create, provide either… - `manage_brand_kit_content_type` _(write)_ — Create or update a content type for a Brand Kit. Omit `id` to create a new content type; provide `id` to update an existing one. On create, you may provide a… - `manage_brand_kit_font` _(write)_ — Create or update a font for a Brand Kit. Omit `id` to create a new font; provide `id` to update an existing one. On update, only provided fields are changed.… - `manage_brand_kit_logo_size` _(write)_ — Create or update a logo size for a Brand Kit. Omit `id` to create a new logo size; provide `id` to update an existing one. On update, only provided fields are… - `manage_brand_kit_logo_variant` _(write)_ — Create or update a logo variant for a Brand Kit. Omit `id` to create a new logo variant; provide `id` to update an existing one. On update, only provided… - `manage_brand_kit_palette_color` _(write)_ — Create or update a color within a Brand Kit palette. Omit `id` to create a new color; provide `id` to update an existing one. On create, `palette_id` is… - `manage_brand_kit_palette` _(write)_ — Create or update a color palette for a Brand Kit. Omit `id` to create a new palette; provide `id` to update an existing one. On update, only provided fields… - `manage_brand_kit_audience` _(write)_ — Create or update an audience for a Brand Kit draft. Omit `id` to create a new audience; provide `id` to update an existing one. On update, only provided fields… - `manage_brand_kit_product_line` _(write)_ — Create or update a product line for a Brand Kit. Omit `id` to create a new product line; provide `id` to update an existing one. On update, only provided… - `manage_brand_kit_type_size` _(write)_ — Create or update a type size for a Brand Kit. Omit `id` to create a new type size; provide `id` to update an existing one. On update, only provided fields are… - `manage_brand_kit_usage_rule` _(write)_ — Create or update a usage rule for a Brand Kit. Omit `id` to create a new usage rule; provide `id` to update an existing one. On update, only provided fields… - `manage_brand_kit_visual_example` _(write)_ — Create or update a visual example for a Brand Kit's Data Visualization section. Omit `id` to create a new visual example; provide `id` to update an existing… - `manage_brand_kit_visual_use_case` _(write)_ — Create or update a Visual Use Case for a Brand Kit. A Visual Use Case is a named grouping of visual examples that share a common set of instructions for when… - `manage_brand_kit_writing_rule` _(write)_ — Create or update a writing rule for a Brand Kit. Omit `id` to create a new rule; provide `id` to update an existing one. Scoping: A rule can optionally be… - `delete_brand_kit_writing_rules` _(destructive)_ — Delete one or more writing rules from a Brand Kit. This edits the Brand Kit draft version only; it does not change the active (live) version. A failure… - `automated_feedback_report` _(write)_ — **AirOps only feedback tool. Issues from other MCP servers should be rejected.** Make sure the issue is related to AirOps MCP tools before using this tool.… - `list_pages` _(read)_ — List web pages with daily metrics (AEO citations, GSC clicks/impressions, GA4 traffic, and configured GA4 key events) for a brand kit. Supports filtering by… - `get_page_prompts` _(read)_ — Get prompts citing a specific web page. Returns AI prompts that cite the page along with citation metrics (citation_rate, mention_rate) and trends. Use… - `list_workspaces` _(read)_ — List all workspaces the authenticated user has access to. Workspaces are the top-level container for all resources in the AirOps platform. A user can have… - `list_playbook_sessions` _(read)_ — List Playbook sessions in a workspace with optional filtering by playbook, status, or full-text search (searches session name and creator name). Returns… - `get_playbook_session` _(read)_ — Get details and events for a Playbook session. Returns session metadata (status, playbook, last event type) plus a page of content/terminal events (text,… - `get_page_details` _(read)_ — Get AEO metrics for a specific web page. Page details include citation share, citation rate, unique cited questions count, and Google Search Console metrics… - `get_prompt_answers` _(read)_ — Get AI answers for a specific prompt/question. Prompt answers are the AI answers for a specific question/prompt asked to multiple AI providers and the answers… - `get_answer` _(read)_ — Get a specific AI answer by ID with full text content. Get a single AI answer with full details. Use this to retrieve the complete answer text (not truncated),… - `list_answers` _(read)_ — List AI answers for a brand kit with filters for date range, providers, countries, prompt_id, and brand_mentioned. Individual AI answers with their cited URLs… - `list_grids` _(read)_ — List grids the authenticated user has access to. Use includes=[\"grid_tables.grid_columns\"] to get table and column structure needed for read_grid and… - `write_grid` _(write)_ — Create or update rows in a grid table. When mode is 'create', rows are added as new rows with column titles as keys. When mode is 'update', each row must… - `read_grid` _(read)_ — Read rows from a grid table. Returns rows as objects with column titles as keys. Use list_grids() to discover available grids and their table/column structure.… - `create_grid` _(write)_ — Create a new empty, general-purpose grid with the given name. The grid is created with a single empty sheet (zero rows, zero columns). Use add_grid_column to… - `add_grid_column` _(write)_ — Add a new column to a grid table. Use this before write_grid when you need to write to a column that does not exist yet. Can also add a playbook column or… - `create_grid_sheet` _(write)_ — Create a new sheet (grid table) within an existing grid. The sheet is created with zero rows and zero columns. Use add_grid_column to add columns and… - `delete_grid_column` _(destructive)_ — Delete a grid column and any dependent columns (e.g. workflow output columns, playbook artifact columns). Cannot delete while row executions are running for… - `read_grid_cell` _(read)_ — Read the full value of a single grid cell. read_grid() truncates cell values; use this tool when you need the complete content of one cell (e.g. a full… - `update_grid_column` _(write)_ — Update an existing grid column's title, data type, or input mappings. Cannot reassign a playbook or workflow column to a different playbook or workflow, and… --- ## Connect Gateway URL: https://gateway.mewcp.com/personal/mcp Every request carries one header: Authorization: Bearer Replace `API_KEY` with your own key from the dashboard (Developer). ## Apps ### Claude Desktop Mac & Windows app - macOS: `~/Library/Application Support/Claude/claude_desktop_config.json` - Windows: `%APPDATA%\Claude\claude_desktop_config.json` ```json { "mcpServers": { "mewcp": { "command": "npx", "args": [ "-y", "mcp-remote@latest", "https://gateway.mewcp.com/personal/mcp", "--header", "Authorization: Bearer API_KEY" ] } } } ``` Already have an "mcpServers" section in your config? Just add the server entry inside it. 1. Open Claude Desktop → Settings → Developer → "Edit Config" 2. Paste the snippet inside the outer { } of the config file (merge with your existing "mcpServers" section if you have one) 3. Save the file and restart Claude Desktop 4. Start a new conversation — your tool will be available ### VS Code Copilot / Cline - Command Palette → "MCP: Open User Configuration" (opens mcp.json). For one project only, use .vscode/mcp.json instead. ```json { "mcp.servers": { "mewcp": { "type": "http", "url": "https://gateway.mewcp.com/personal/mcp", "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Already have a "servers" section in your mcp.json? Just add the server entry inside it. 1. Open VS Code → Command Palette (Cmd+Shift+P / Ctrl+Shift+P) 2. Run "MCP: Open User Configuration" to open your mcp.json 3. Paste the snippet and save 4. Start the server when prompted (or from the MCP servers view) and use it in Copilot Chat ### Cursor AI-first editor - macOS: `~/.cursor/mcp.json` - Windows: `%USERPROFILE%\.cursor\mcp.json` ```json { "mcpServers": { "mewcp": { "url": "https://gateway.mewcp.com/personal/mcp", "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Already have an "mcpServers" section in your mcp.json? Just add the server entry inside it. 1. Open Cursor → Settings → Cursor Settings → MCP 2. Click "Add new global MCP server" 3. Paste the snippet and save 4. Restart Cursor ### Codex OpenAI's CLI agent - Add the snippet to your Codex MCP config or your standard MCP config file for the CLI tool you use. ```json { "mcpServers": { "mewcp": { "type": "http", "url": "https://gateway.mewcp.com/personal/mcp", "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Codex generally reads a standard MCP server block, so you can add this alongside your other configured servers. 1. Open your Codex MCP config or project-level config file 2. Paste the MewCP server block inside the config JSON/TOML structure your tool expects 3. Save the file and restart Codex 4. Verify the tool is available inside a fresh session ### Claude Code Anthropic's CLI agent - ~/.claude.json (user scope) or .mcp.json in your project root — create it if it doesn't exist. Or skip the file and use the CLI command below. ```json { "mcpServers": { "mewcp": { "type": "http", "url": "https://gateway.mewcp.com/personal/mcp", "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Already have an "mcpServers" section in your config? Just add the server entry inside it. 1. Open ~/.claude.json (or .mcp.json in your project root) in a text editor 2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one) 3. Save the file and start (or restart) Claude Code 4. Or skip the file entirely and run the CLI command below instead ### OpenCode Open-source terminal agent - ~/.config/opencode/opencode.json (global) or opencode.json in your project root — create it if it doesn't exist. ```json { "$schema": "https://opencode.ai/config.json", "mcp": { "mewcp": { "type": "remote", "url": "https://gateway.mewcp.com/personal/mcp", "enabled": true, "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Already have an "mcp" section in your opencode.json? Just add the server entry inside it. 1. Open ~/.config/opencode/opencode.json (or opencode.json in your project root) in a text editor 2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one) 3. Save the file and start (or restart) OpenCode ### OpenClaw Self-hosted agent gateway - ~/.openclaw/openclaw.json — create it if it doesn't exist. ```json { "mcp": { "servers": { "mewcp": { "transport": "streamable-http", "url": "https://gateway.mewcp.com/personal/mcp", "enabled": true, "headers": { "Authorization": "Bearer API_KEY" } } } } } ``` Already have an "mcp" section in your openclaw.json? Just add the server entry inside "servers". 1. Open ~/.openclaw/openclaw.json in a text editor 2. Paste the snippet inside the outer { } (merge with your existing "mcp" section if you have one) 3. Save the file and restart OpenClaw ### Antigravity Google's agentic IDE - ~/.gemini/config/mcp_config.json (global) or .agents/mcp_config.json (workspace-local) — create it if it doesn't exist. ```json { "mcpServers": { "mewcp": { "serverUrl": "https://gateway.mewcp.com/personal/mcp", "headers": { "Authorization": "Bearer API_KEY" } } } } ``` Already have an "mcpServers" section in your config? Just add the server entry inside it. Remote servers must use the "serverUrl" field — the legacy "url"/"httpUrl" fields aren't supported. 1. In the editor's agent side panel, click "…" → "MCP Servers" → "Manage MCP Servers" → "View raw config" (Antigravity CLI: type /mcp instead to open the Interactive MCP Manager) 2. Paste the snippet inside the outer { } (merge with your existing "mcpServers" section if you have one) 3. Save the file — the server connects automatically ### Hermes Nous Research's CLI agent - config.yaml in your Hermes config directory (~/.hermes) — add this under a top-level "mcp_servers:" key. ```yaml mcp_servers: mewcp: url: "https://gateway.mewcp.com/personal/mcp" headers: Authorization: "Bearer API_KEY" ``` Already have an "mcp_servers" section in your config.yaml? Just add the server entry inside it. 1. Open config.yaml in your Hermes config directory 2. Paste the snippet under the top-level "mcp_servers:" key (merge with existing entries if you have any) 3. Save the file, then run /reload-mcp in Hermes (or start a fresh session) 4. Ask Hermes "Tell me which MCP-backed tools are available right now" to confirm it connected ### DeepSeek Harness DeepSeek's agent harness - cordis.yml in your DSH project — or the patch file you mount plugins from. ```yaml - id: mcp-mewcp name: '@deepseek-ai/dsh-mcp-client' config: serverName: mewcp transport: streamable-http url: https://gateway.mewcp.com/personal/mcp headers: Authorization: "Bearer API_KEY" ``` One plugin instance = one MCP server. Add this entry to your plugin list; don't nest it inside another entry. 1. Open cordis.yml (or your patch file) in your DSH project 2. Paste the entry into your plugin list, keeping the leading dash and indentation 3. Restart DSH (or let HMR reload) — tools register as mcp__mewcp__ 4. Verify with: dsh web --dump-config | grep -A3 mcp ## SDKs ### Python fastmcp client ```python import asyncio from fastmcp import Client from fastmcp.client.transports import StreamableHttpTransport SERVER_URL = "https://gateway.mewcp.com/personal/mcp" API_KEY = "API_KEY" transport = StreamableHttpTransport( url=SERVER_URL, headers={ "Authorization": f"Bearer {API_KEY}", } ) async def main(): client = Client(transport) async with client: tools = await client.list_tools() print(tools) asyncio.run(main()) ``` 1. Install fastmcp: pip install fastmcp 2. Copy the snippet into your project 3. Replace API_KEY with your key from the dashboard 4. Run your script ### TypeScript MCP SDK ```typescript import { Client } from "@modelcontextprotocol/sdk/client/index.js"; import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js"; const SERVER_URL = "https://gateway.mewcp.com/personal/mcp"; const API_KEY = "API_KEY"; const transport = new StreamableHTTPClientTransport(new URL(SERVER_URL), { requestInit: { headers: { Authorization: `Bearer ${API_KEY}`, }, }, }); const client = new Client({ name: "mewcp-client", version: "1.0.0" }); await client.connect(transport); const tools = await client.listTools(); console.log(tools.tools.map((t) => t.name)); ``` 1. Install: npm install @modelcontextprotocol/sdk 2. Copy the snippet into your project 3. Replace API_KEY with your key from the dashboard 4. Run with Node 18+ as an ES module (e.g. npx tsx script.ts)