# Connect an assistant (MCP)

> Let Claude write posts, update pages and read forms for one organization.

Source: https://docs.dashfordevs.com/v1/ai-agents/connect-an-assistant · Topic: For AI agents · Updated: 2026-11-07

The [Model Context Protocol](https://modelcontextprotocol.io/) (MCP) server lets an AI assistant work with **one organization** using that organization's **secret key**. Every tool call goes through the same checks as the API: key, organization status, secret-only admin routes, rate limits and personal-data gates. The key cannot reach any other organization.

## 1\. Make a key for the assistant

In the dashboard, open **Developers → API keys** and create a key just for the assistant, named for it ("Claude, John's laptop"). Then you can see its traffic separately and revoke it alone.

## 2\. Connect

**[Claude Code](https://docs.anthropic.com/en/docs/claude-code/mcp):**

```bash
claude mcp add --transport http dashfordevs https://papi.dashfordevs.com/mcp/org \
  --header "Authorization: Bearer sk_live_YOUR_SECRET_KEY"
```

**Clients that only accept a URL** (some connectors):

```
https://papi.dashfordevs.com/mcp/org/sk_live_YOUR_SECRET_KEY
```

A key in a URL can end up in logs. Prefer the header form; if you must use the URL, use a dedicated key and regenerate it if it is ever shared.

The dashboard's **MCP** page (sidebar: **MCP → MCP server**) shows these snippets and the live tool list.

## 3\. Tools

| Tool | Does |
| --- | --- |
| `org_info` | The organization the key belongs to. |
| `blog_list`, `blog_get` | Read posts (list without bodies; one with its HTML). |
| `blog_create`, `blog_update`, `blog_delete` | Write posts. Bodies are HTML; code as `<pre><code class="language-x">`. |
| `blog_categories`, `blog_category_create` | Categories for posts. |
| `page_groups_list`, `page_group_create` | Page groups (content types). Create is idempotent by slug. |
| `page_items_list`, `page_item_get` | Read items in a page group. |
| `page_item_create`, `page_item_update`, `page_item_delete` | Write items, with their custom fields. |
| `contact_forms_list`, `contact_form_get` | Read contact form submissions (personal data: held back by the personal-data gate where it applies). |
| `admin_endpoints` | List every admin API route the key can call. |
| `admin_request` | Call one of those routes directly, for anything not covered above. |

## Good prompts

-   "Draft a blog post about our spring menu in the Seasonal category. Keep it as a draft."
-   "List the items in the Services page group and fix any description over 160 characters."
-   "Summarize this week's contact form submissions by topic, without quoting names or emails."
