# Close MCP MCP Server

> **Close MCP MCP Server** is a hosted, multitenant Model Context Protocol (MCP) server run by **MewCP** (https://mewcp.com), giving AI agents managed access to Close 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/close-mcp
> MewCP docs:   https://docs.mewcp.com
> Full catalog: https://mewcp.com/llms.txt

---

## About

Connect Close CRM with AI agents to manage customer data, streamline sales workflows, and automate CRM tasks. Use Close's secure MCP integration to access and interact with your organization's CRM through compatible AI clients.

---

## Details

- Server ID: `close-mcp`
- Version: latest
- Tools: 118
- 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 — Close MCP has to be in the toolset
first. In order:

1. Add Close MCP to your toolset at https://mewcp.com/mcp/close-mcp
2. Connect your Close 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 (118)

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.

- `org_info` _(read)_ — Return general information about the organization and the user.
- `org_users` _(read)_ — Return active users (memberships) which are part of the current org.
- `list_membership_requests` _(read)_ — List pending requests to join the current organization. Each entry includes the requesting user's name and email, the request id, and when the request was…
- `find_memberships` _(read)_ — List the organization's members with each member's role name, whether the role is built-in or custom, active/inactive status, and join date. Richer than…
- `fetch_membership` _(read)_ — Fetch one of the organization's members by user id.
- `list_roles` _(read)_ — List the roles that can be assigned in the organization. Covers Close's built-in roles plus any custom roles the org defines. Use this to resolve a role name…
- `fetch_role` _(read)_ — Fetch one of the organization's roles by id, with every permission it grants. Use `list_roles` to resolve a role name to its id.
- `customized_builtin_labels` _(read)_ — Return the customized builtin labels. Only renamed labels are returned - an empty result means the default names apply.
- `find_groups` _(read)_ — List all groups in the organization.
- `create_comment` _(write)_ — Add a comment to a commentable object (note, call, opportunity, task, custom object, etc.). If the object already has a comment thread, the new comment is…
- `fetch_comment` _(read)_ — Fetch a single comment by ID. Returns the comment's rich-text (HTML) body, the thread and lead it belongs to, its @-mentions, and the resolved author and…
- `get_ai_credit_usage` _(read)_ — AI credit usage for the billing account, broken down by feature. Reports total credits used and a per-feature breakdown. Credits are the billing unit for AI…
- `get_billing_summary` _(read)_ — Billing summary for the organization's billing account. Reports the subscription plan, billing status with the trial end date, seat counts, and AI usage…
- `find_invoices` _(read)_ — Find the organization's billing invoices, newest first. Invoices without a date sort first.
- `fetch_invoice` _(read)_ — Fetch one of the organization's billing invoices by id.
- `find_lead_statuses` _(read)_ — List or find lead statuses for the organization
- `fetch_lead_status` _(read)_ — Fetch a lead status by ID.
- `create_lead_status` _(write)_ — Create a new lead status.
- `update_lead_status` _(destructive)_ — Update the label of an existing lead status.
- `delete_lead_status` _(destructive)_ — Permanently delete a lead status. Cannot delete if it's the last lead status in the organization or there are leads currently using this status.
- `find_email_templates` _(read)_ — List or find email templates
- `fetch_email_template` _(read)_ — Fetch an email template by ID. Returns the complete email template with all its details.
- `update_email_template` _(destructive)_ — Update an existing email template. Only fields that are provided and not None will be updated. Handling of attachments and unsubscribe links via this tool is…
- `create_email_template` _(write)_ — Create a new email template. Handling of attachments and unsubscribe links via this tool is currently unsupported. Email template body should be HTML…
- `delete_email_template` _(destructive)_ — Permanently delete an email template. If the template is used in any workflows (sequences), it cannot be deleted.
- `find_sms_templates` _(read)_ — List or find SMS templates
- `fetch_sms_template` _(read)_ — Fetch an SMS template by ID. Returns the complete SMS template with all its details.
- `update_sms_template` _(destructive)_ — Update an existing SMS template. Only fields that are provided will be updated. Fields that are not provided will remain unchanged. Handling of attachments via…
- `create_sms_template` _(write)_ — Create a new SMS template. Handling of attachments via this tool is currently unsupported. Use template tags as placeholders, for example: {{ organization.name…
- `delete_sms_template` _(destructive)_ — Permanently delete an SMS template. If the template is used in any workflows (sequences), it cannot be deleted.
- `create_lead` _(write)_ — Create a new lead (company). After creating a lead, you should usually add an address or contact (including phone or email) to the lead.
- `update_lead` _(destructive)_ — Update an existing lead (company). Only fields that are provided and not None will be updated.
- `fetch_lead` _(read)_ — Fetch an existing lead (company) by ID.
- `delete_lead` _(destructive)_ — Permanently delete an existing lead (company) by ID including all of its addresses, contacts, opportunities, tasks, and activities. ONLY call this if the user…
- `create_address` _(write)_ — Add a new address to an existing lead (company).
- `delete_address` _(destructive)_ — Delete an address from an existing lead (company) if there is an exact match.
- `find_lead_smart_views` _(read)_ — List lead smart views (saved searches).
- `fetch_lead_smart_view` _(read)_ — Fetch a lead smart view (saved search) by ID.
- `update_lead_smart_view` _(destructive)_ — Update a lead smart view (saved search). Only fields that are provided and not None will be updated.
- `delete_lead_smart_view` _(destructive)_ — Permanently delete a lead smart view (saved search).
- `create_contact` _(write)_ — Create a new contact for a lead. A contact represents a person associated with a lead (company).
- `fetch_contact` _(read)_ — Fetch an existing contact by ID. Returns the contact's details including name, title, email addresses, phone numbers, and URLs.
- `update_contact` _(destructive)_ — Update an existing contact. You can update a contact's name, title, email addresses, phone numbers, and URLs. Only fields that are provided will be updated.
- `delete_contact` _(destructive)_ — Permanently delete an existing contact. This will remove the contact from its lead including its email addresses, phone numbers, and URLs will be removed.…
- `create_note` _(write)_ — Create a new note on a lead. A note is a text-based activity attached to a lead. At least one of note (plaintext) or note_html (rich text) must be provided.
- `fetch_note` _(read)_ — Fetch an existing note by ID. Returns the full note details including title, text, and metadata.
- `update_note` _(destructive)_ — Update an existing note. Only fields that are provided will be updated. Note content is provided as rich text (HTML) via note_html; the plaintext note is…
- `find_notes` _(read)_ — Find notes based on various filters.
- `delete_note` _(destructive)_ — Permanently delete an existing note. This action cannot be undone. ONLY call this if the user specifically instructed you to delete the note.
- `fetch_call` _(read)_ — Fetch a single call activity by ID. Returns the call's direction, outcome, participants, and (if available) its transcript.
- `create_draft_email` _(write)_ — Create a draft email on a lead. The email is saved as an unsent draft for the user to review, edit, and send from Close; it is never sent automatically.…
- `update_draft_email` _(destructive)_ — Update an existing draft email. Only draft emails can be updated; sent or scheduled emails are rejected. Only fields that are provided are changed. When the…
- `fetch_email` _(read)_ — Fetch a single email activity by ID.
- `fetch_email_thread` _(read)_ — Fetch a single Email Thread by ID. Returns thread metadata plus its most recent emails, newest first, with plaintext bodies. Returns only IDs for older…
- `fetch_sms` _(read)_ — Fetch a single SMS activity by ID. Returns the complete SMS, including message text and attachments.
- `fetch_meeting_transcript` _(read)_ — Fetch a meeting's Notetaker transcript(s) by meeting activity ID. Returns the meeting's speaker breakdown, summary, and full speaker-labeled transcript text.…
- `lead_search` _(read)_ — Perform a simple lead search and return the initial set of results. Use this to retrieve all leads, most recent leads, search leads by keyword, or filter by…
- `paginate_search` _(read)_ — Paginate a search to retrieve more results. Provide exactly one of: - `search_id`: a `share_*` id from a previous search or shared entry, or - `smart_view_id`:…
- `activity_search` _(read)_ — Search for activities. Results are returned ordered by date descending. Examples: - To list activities on a lead, use the lead_ids filter. - To list…
- `search` _(read)_ — Perform a natural language search for leads or contacts. If a more specific search tool (like lead_search or activity_search) satisfies the request, use that…
- `aggregation` _(read)_ — Perform an aggregation to answer questions like: - How many emails were sent this week? - Calls by user this week (Who made the most?) You MUST first fetch the…
- `get_fields` _(read)_ — Use this tool ONLY to get a list of fields for the aggregation tool.
- `close_product_knowledge_search` _(read)_ — Search Close product documentation and knowledge base for relevant information. Use this tool when users ask about: - How to use specific Close features -…
- `find_workflows` _(read)_ — List or find workflows
- `fetch_workflow` _(read)_ — Fetch a single workflow by ID.
- `create_workflow` _(write)_ — Create a new workflow (a.k.a. sequence) with Draft status.
- `find_pipelines_and_opportunity_statuses` _(read)_ — List all opportunity pipelines and their opportunity statuses in the organization.
- `fetch_pipeline_and_opportunity_statuses` _(read)_ — Fetch an opportunity pipeline, including its opportunity statuses, by ID.
- `create_pipeline` _(write)_ — Create a new opportunity pipeline. Use the create_opportunity_status tool to add statuses to the pipeline.
- `update_pipeline` _(destructive)_ — Update an existing opportunity pipeline. Only fields that are provided will be updated.
- `delete_pipeline` _(destructive)_ — Permanently delete an opportunity pipeline. A pipeline can only be deleted if it has no statuses. The last pipeline cannot be deleted.
- `fetch_opportunity_status` _(read)_ — Fetch an opportunity status by ID.
- `create_opportunity_status_tool` _(write)_ — Create a new opportunity status.
- `update_opportunity_status_tool` _(destructive)_ — Update the label of an existing opportunity status.
- `delete_opportunity_status_tool` _(destructive)_ — Permanently delete an opportunity status. Cannot delete if it's the last opportunity status in the organization or there are opportunities currently using this…
- `find_opportunities` _(read)_ — Find opportunities by status (active/won/lost), owner, lead, or close-date range, optionally only those needing attention, sorted by soonest close, largest…
- `fetch_opportunity` _(read)_ — Fetch a specific opportunity by ID. Returns the complete opportunity with all its details.
- `create_opportunity` _(write)_ — Create a new opportunity. Requires a lead ID and status ID. Other fields are optional. The value should be specified in cents (e.g., $100.00 = 10000).
- `update_opportunity` _(destructive)_ — Update an existing opportunity. Only fields that are provided will be updated. The value should be specified in cents (e.g., $100.00 = 10000).
- `delete_opportunity` _(destructive)_ — Permanently delete an opportunity. This action cannot be undone. All data associated with the opportunity will be removed.
- `find_call_outcomes` _(read)_ — List all outcomes applicable to calls available in the organization.
- `find_meeting_outcomes` _(read)_ — List all outcomes applicable to meetings available in the organization.
- `find_scheduling_links` _(read)_ — List available scheduling links for the user and org. User-owned personal links come with a URL. Shared links come with a special template tag. Each can be…
- `create_task` _(write)_ — Create a new task for a lead. A task represents a to-do item that can be assigned to a user and optionally associated with a contact.
- `fetch_task` _(read)_ — Fetch an existing task by ID. Returns the task's details including the associated lead, contact, assignee, due date, priority, and completion status.
- `find_tasks` _(read)_ — Find tasks based on various filters. You can filter by lead, assignee, completion state, and due/created/ updated dates.
- `update_task` _(destructive)_ — Update an existing task. Only fields that are provided will be updated. Pass 'clear' for contact_id or due_date to clear those values.
- `delete_task` _(destructive)_ — Permanently delete an existing task by ID. This action cannot be undone. ONLY call this if the user specifically instructed you to delete the task.
- `create_call_task` _(destructive)_ — Schedule a call task on a lead, assigned to either a user or a voice agent (Chloe). A call task represents a scheduled outbound call that will be made to the…
- `fetch_call_task` _(read)_ — Fetch a single call task by ID.
- `update_call_task` _(destructive)_ — Update a call task. Only fields that are provided will be updated. Reassigning to a user or voice agent (agent_config_id) affects only this task. Completing a…
- `find_call_tasks` _(read)_ — Find call tasks based on various filters. You can filter by lead, contact, assignee (a user or a voice agent), completion state, and scheduled/created/updated…
- `delete_call_task` _(destructive)_ — Delete a call task. Does not affect sibling tasks.
- `fetch_custom_activity_instance` _(read)_ — Fetch an existing custom activity instance by ID. A custom activity instance is an activity of a custom activity type, holding the custom field values defined…
- `find_custom_activity_instances` _(read)_ — Find a lead's custom activity instances based on various filters. A custom activity instance is an activity of a custom activity type, holding the custom field…
- `create_custom_activity_instance` _(write)_ — Create a new custom activity instance on a lead. A custom activity instance is an activity of a custom activity type, holding the custom field values defined…
- `update_custom_activity_instance` _(destructive)_ — Update an existing custom activity instance. A custom activity instance is an activity of a custom activity type, holding the custom field values defined by…
- `delete_custom_activity_instance` _(destructive)_ — Permanently delete an existing custom activity instance. This action cannot be undone. ONLY call this if the user specifically instructed you to delete the…
- `find_custom_activities` _(read)_ — List all active (non-archived) Custom Activity Types in the organization, along with the custom fields defined on each type. Call this before creating a…
- `fetch_custom_object_type` _(read)_ — Fetch a single custom object type by its ID. A custom object type defines the shape of a category of custom objects, including the custom fields its instances…
- `find_custom_object_types` _(read)_ — List all custom object types in the organization, along with the custom fields defined on each type.
- `fetch_custom_object_instance` _(read)_ — Fetch an existing custom object instance by ID. A custom object instance is a record of a custom object type, attached to a lead and holding the custom field…
- `find_custom_object_instances` _(read)_ — Find a lead's custom object instances. A custom object instance is a record of a custom object type, attached to a lead and holding the custom field values…
- `create_custom_object_instance` _(write)_ — Create a new custom object instance on a lead. A custom object instance is a record of a custom object type, attached to a lead and holding the custom field…
- `update_custom_object_instance` _(destructive)_ — Update an existing custom object instance. A custom object instance is a record of a custom object type, attached to a lead and holding the custom field values…
- `delete_custom_object_instance` _(destructive)_ — Permanently delete an existing custom object instance. A custom object instance is a record of a custom object type, attached to a lead and holding the custom…
- `find_forms` _(read)_ — List all web forms in the organization. Call this before creating a workflow with a "form-submission-event" trigger so you can look up the correct Form ID.
- `find_lead_custom_fields` _(read)_ — List all lead custom fields defined for the organization. Returns each field's ID, name, description, type, allowed choices (for choice fields), whether…
- `find_contact_custom_fields` _(read)_ — List all contact custom fields defined for the organization. Includes both contact-specific fields and shared fields associated with contacts. Returns each…
- `find_opportunity_custom_fields` _(read)_ — List all opportunity custom fields defined for the organization. Includes both opportunity-specific fields and shared fields associated with opportunities.…
- `find_voice_agents` _(read)_ — List all voice agents configured for the organization. Voice agents are AI callers that place outbound calls to leads' contacts on the user's behalf. Returns…
- `get_voice_agents` _(read)_ — Return detailed configuration for one or more voice agents. Includes each agent's objective, user instructions, and which skills are enabled. Use this as the…
- `schedule_voice_agent_call` _(destructive)_ — Schedule a voice agent to call a lead's contact. Creates a call task assigned to the voice agent. The voice agent will place the call automatically at the…
- `propose_voice_agent_update` _(read)_ — Propose a voice agent configuration update from natural-language feedback. This tool does not apply changes to the voice agent. It returns a short behavioral…
- `apply_voice_agent_update` _(destructive)_ — Apply a previously proposed voice agent update. This tool persists the server-stored proposal identified by proposal_id. It does not rerun the feedback…
- `get_voice_agent_performance_report` _(read)_ — Performance metrics for one voice agent. Returns the numbers shown on the Performance tab of a Voice Agent detail page. Passing multiple `agent_config_ids`…
- `get_voice_agent_overview_report` _(read)_ — Cross-agent rollup for the Voice Agents list page. Returns one row per **active** agent — agents with completed calls in `date_range` **or** queued upcoming…
- `enrich_field` _(destructive)_ — Use AI to determine and set the value of a field on a lead or contact. The field is enriched using available data on the object and external sources, and the…

---

## Connect

Gateway URL: https://gateway.mewcp.com/personal/mcp

Every request carries one header:

    Authorization: Bearer <API_KEY>

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__<tool_name>
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)