> ## Documentation Index
> Fetch the complete documentation index at: https://docs.profy.cn/llms.txt
> Use this file to discover all available pages before exploring further.

# MCP Tools

> The 22 tools exposed by the remote MCP server: parameters, semantics, and known defects

# MCP Tools

Profy runs a remote MCP (Model Context Protocol) server so you can go from distillation to configuration to publishing to monetisation inside Codex, Cursor, Claude Code, or any MCP-capable IDE — without leaving the editor.

```
https://mcp.profy.cn/mcp
```

Transport is Streamable HTTP and **stateless** (no session management).

## Setup

```json .mcp.json theme={null}
{
  "mcpServers": {
    "profy": {
      "type": "streamable-http",
      "url": "https://mcp.profy.cn/mcp"
    }
  }
}
```

Authentication reuses the platform login session in two forms:

* `Authorization: Bearer <token>`
* Browser cookie (for embedded-browser IDE flows)

Calling an identity-bound tool while unauthenticated errors out. It does **not** silently degrade to anonymous access.

## Full tool table

22 tools, all thin proxies over existing platform services with no independent business logic.

### Identity (2)

| Tool                  | Parameters                                   | Purpose                              |
| --------------------- | -------------------------------------------- | ------------------------------------ |
| `get_creator_profile` | none                                         | Read your creator status and details |
| `apply_creator`       | `displayName`, `bio`, `accountType`, `email` | Apply to become a creator            |

`apply_creator` enters human review. The outcome arrives by in-app notification; there is nothing to poll on the MCP side.

### Agent configuration (4)

| Tool                | Parameters                                            | Purpose                     |
| ------------------- | ----------------------------------------------------- | --------------------------- |
| `create_expert`     | `name`, `description`, `category`                     | Create an agent draft       |
| `update_expert`     | `identifier` plus `name` / `description` / `category` | Update configuration fields |
| `get_expert_detail` | `identifier`                                          | Get one agent's detail      |
| `list_my_experts`   | none                                                  | List all agents you created |

<Note>
  `update_expert` covers basic metadata only. **Prompt layers (GUARD / persona / soul / agent), subagents, and case demos are not on the MCP surface** — they are either intellectual property or structurally too intricate to edit blind from an IDE. Those go through Studio.
</Note>

### Skills (3)

| Tool                      | Parameters                | Purpose                                   |
| ------------------------- | ------------------------- | ----------------------------------------- |
| `install_skill`           | `identifier`, `skillName` | Install a marketplace skill onto an agent |
| `list_expert_skills`      | `identifier`              | List installed skills                     |
| `list_marketplace_skills` | `keyword`                 | Browse the skill marketplace              |

<Warning>
  **`install_skill` is a stub and installs nothing.**

  The current implementation writes a log line and returns `{"success": true, "installed": "<skillName>"}`; the installation service is not wired. The call succeeds, the response says success, and `list_expert_skills` afterwards shows no change.

  This is the most dangerous defect shape — a failure wearing a success mask. You get no error, only confusion about why the skill has no effect. Install skills through Studio or `POST /api/expert-skills/install`.
</Warning>

### Billing and publishing (3)

| Tool                    | Parameters                                                             | Purpose               |
| ----------------------- | ---------------------------------------------------------------------- | --------------------- |
| `set_billing`           | `identifier`, `billingType`, `price`, `freeTrialPerUser`, `allowTrial` | Set pricing and trial |
| `publish_expert`        | `identifier`                                                           | Submit for review     |
| `get_submission_status` | `identifier`                                                           | Check review status   |

<Warning>
  `set_billing` takes `billingType` as `METERED | ONE_TIME`, but neither name **maps to the real billing model**:

  * `METERED` → writes price 0 → the agent becomes **free**
  * `ONE_TIME` → writes `price` → the agent becomes **unlock-on-purchase**

  The platform has only `FREE` and `UNLOCK`; there is no metered agent. So passing `METERED` expecting usage-based charging yields a fully free agent. This is naming drift between the MCP surface and the underlying model; the underlying model is authoritative.
</Warning>

`freeTrialPerUser` defaults to 3 and `allowTrial` defaults to `true`. Full price and trial constraints are in [Pricing and Billing](/en/creators/pricing-and-billing).

`publish_expert` **submits for review** rather than going live; a published agent stays online while its new version queues.

### Distillation (2)

| Tool                    | Parameters                                      | Purpose                                               |
| ----------------------- | ----------------------------------------------- | ----------------------------------------------------- |
| `start_distillation`    | `topic`, `materials[]` (`filename` + `content`) | Start the distillation interview with local materials |
| `continue_distillation` | `sessionId`, `message`                          | Answer the AI's follow-up and advance                 |

Distillation is multi-turn: `start_distillation` returns a `sessionId`, and every subsequent answer goes through `continue_distillation` carrying that id.

Both tools call the invoke endpoint through an SSE collector internally, folding a stream into one synchronous return — so a single call can take a while.

`materials` carries file contents directly (not paths), so local files in your IDE feed distillation without a separate upload.

### Testing (2)

| Tool               | Parameters              | Purpose                                  |
| ------------------ | ----------------------- | ---------------------------------------- |
| `test_expert`      | `identifier`, `message` | Send one message and read the reply      |
| `open_expert_chat` | `identifier`            | Get a browser URL to chat with the agent |

`test_expert` really executes and **really bills**. For a free look, use `open_expert_chat` and try it in the browser.

### Navigation (1)

| Tool              | Parameters                                              | Purpose                                     |
| ----------------- | ------------------------------------------------------- | ------------------------------------------- |
| `open_profy_page` | `page` (`studio` / `chat` / `marketplace` / `earnings`) | Get the URL of one of four checkpoint pages |

It returns a URL only; whether to open a browser is the IDE's decision.

### Self-evolution (3)

| Tool                         | Parameters     | Purpose                              |
| ---------------------------- | -------------- | ------------------------------------ |
| `list_evolution_suggestions` | `identifier`   | List pending improvement suggestions |
| `accept_evolution`           | `suggestionId` | Accept one suggestion                |
| `get_evolution_stats`        | `identifier`   | Evolution statistics and trends      |

`accept_evolution` **takes effect immediately with no re-review** — skill documents are read at runtime. That is also why you should read the suggestion before accepting. The mechanism is in [Self-Evolution](/en/creators/darwin-evolution).

### Earnings (2)

| Tool                 | Parameters                                | Purpose                                                    |
| -------------------- | ----------------------------------------- | ---------------------------------------------------------- |
| `get_earnings`       | none                                      | Earnings summary (diamond balance and pending withdrawals) |
| `browse_marketplace` | `keyword`, `category`, `page`, `pageSize` | Browse published agents                                    |

`browse_marketplace` is the only tool in the table that does not require an identity.

## A typical flow

Building an agent from scratch inside your IDE:

```
1. get_creator_profile          confirm creator status
2. apply_creator                (if not onboarded)
3. start_distillation           begin with local materials
4. continue_distillation × N    answer follow-ups until done
5. get_expert_detail            review the generated configuration
6. set_billing                  pricing and trial
7. test_expert                  one real run (this bills)
8. publish_expert               submit for review
9. get_submission_status        track the outcome
```

## Boundaries and failure modes

| Symptom                                            | Cause                                    | Fix                                       |
| -------------------------------------------------- | ---------------------------------------- | ----------------------------------------- |
| Tool reports unauthenticated                       | Missing Bearer token or expired cookie   | Sign in again and reconnect MCP           |
| `install_skill` succeeds but nothing installs      | The tool is a stub                       | Use Studio or the REST endpoint           |
| Agent becomes free after `METERED`                 | Enum naming drift                        | Use `ONE_TIME` + `price` to charge        |
| `publish_expert` succeeds but nothing changes live | It submits for review                    | Track with `get_submission_status`        |
| Distillation tools hang for a long time            | They consume an SSE stream synchronously | Raise the IDE's MCP timeout               |
| `test_expert` consumed credits                     | It really executes                       | Use `open_expert_chat` for a free preview |

## Verify your setup

Have the model call `list_my_experts` once. A returned list proves both auth and transport work; an unauthenticated error means the token never arrived.

If you are unsure whether tools were discovered, check that the profy entry in your IDE's MCP panel lists 22 tools. A wrong count usually means the transport was configured as stdio instead of streamable-http.

## Related pages

<CardGroup cols={2}>
  <Card title="Endpoint Reference" icon="list" href="/en/developers/reference/endpoints">
    The equivalent REST surface
  </Card>

  <Card title="Distillation" icon="flask" href="/en/creators/distillation">
    How distillation works
  </Card>

  <Card title="Self-Evolution" icon="dna" href="/en/creators/darwin-evolution">
    How to read evolution suggestions
  </Card>

  <Card title="Pricing and Billing" icon="tag" href="/en/creators/pricing-and-billing">
    Real price and trial constraints
  </Card>
</CardGroup>

<Note>
  Verified 2026-08-11. Sources: `services/core/src/routes/mcp/tools/index.ts` (22 `registerTool` calls), `services/core/src/routes/mcp/index.ts` (transport), `services/core/src/routes/mcp/auth.ts` (auth).
</Note>
