All docs
MCP server
Credential: API token
BirchSeek serves a Model Context Protocol endpoint at https://api.birchseek.com/v1/mcp/sse. An agent connected to it can research keywords, start a pipeline run, approve each gate and publish.
Protocol revision 2024-11-05, transport HTTP with SSE. A client that asks for a later revision is answered with 2024-11-05 and can carry on from there.
Mint an API token
Settings → Account → API tokens. Name it, pick its scopes, pick an expiry, create.
The secret looks like bsk_mcp_… and is shown once. BirchSeek stores only its hash. Revoking a token ends every session holding it within a minute.
Connect your MCP client
{
"mcpServers": {
"birchseek": {
"type": "sse",
"url": "https://api.birchseek.com/v1/mcp/sse",
"headers": { "Authorization": "Bearer bsk_mcp_…" }
}
}
}
The token goes in the Authorization header. There is no query-string fallback.
To check a connection by hand:
curl -N https://api.birchseek.com/v1/mcp/sse -H "authorization: Bearer $TOKEN"
# event: endpoint
# data: /v1/mcp/messages?sessionId=0199f0c8-…
The first frame is always the endpoint event. Post JSON-RPC frames to that path; answers arrive on the stream.
Token scopes
| Scope | Grants |
|---|---|
projects:read |
Projects, connectors, internal links, calendar |
projects:write |
Create projects, approve internal links |
pipeline:read |
Runs, articles, scores, claims |
pipeline:write |
Start, retry and cancel runs; keyword research; edit drafts; resolve claims |
approve |
Approve and reject the topic, brief and draft gates |
publish |
Publish and reschedule articles |
publish is off unless you tick it. A token without it can take an article to the publish gate and no further.
MCP tools
| Tool | Scope | Does |
|---|---|---|
list_projects |
projects:read |
Your projects |
get_project |
projects:read |
Readiness: connectors, links, context docs, quota |
create_project |
projects:write |
New project, with an optional sitemap crawl |
list_connectors |
projects:read |
Publishing connectors and their status |
list_internal_links |
projects:read |
Link inventory, suggested and approved |
approve_internal_links |
projects:write |
Approve suggested links so articles can use them |
get_calendar |
projects:read |
Scheduled publishes and due refreshes |
research_keywords |
pipeline:write |
Start keyword discovery |
list_opportunities |
pipeline:read |
Ranked keyword opportunities |
start_pipeline_run |
pipeline:write |
Start a run from an opportunity, a topic, or nothing |
get_pipeline_run |
pipeline:read |
Run state plus next_action |
list_pipeline_runs |
pipeline:read |
Runs for a project |
approve_gate |
approve |
Approve the pending gate by name |
reject_gate |
approve |
Reject it with a note |
publish_article |
publish |
Resolve the publish gate and ship |
retry_pipeline_run |
pipeline:write |
Retry from the failed step |
cancel_pipeline_run |
pipeline:write |
Cancel a run |
reschedule_publish |
publish |
Move a scheduled publish |
get_article |
pipeline:read |
Metadata, scores, sections, body |
get_article_claims |
pipeline:read |
Every claim and its verification state |
update_article_body |
pipeline:write |
Replace the body; returns fresh scores |
regenerate_section |
pipeline:write |
Rewrite one section |
resolve_claim |
pipeline:write |
Cut a claim or replace its source |
Nine birchseek:// resource templates cover projects, runs and articles; birchseek://runs/{id} and birchseek://articles/{id} are subscribable. Three prompts ship with the server: publish_one_article, triage_review_queue, plan_content_batch.
The approval loop
Every run has four gates, and an agent has to resolve all four. Address them by name.
| Gate | Payload | Rejecting |
|---|---|---|
topic_approval |
{opportunity_id} |
cancels the run |
brief_approval |
{}, or {section_plan, meta_options} to edit |
re-runs research with your note |
draft_review |
{} |
re-runs drafting with your note |
publish_approval |
{connector_id, publish_date?, slug_override?} |
cancels the run |
get_pipeline_run returns a next_action naming the one move to make:
next_action.kind |
Move |
|---|---|
wait |
Poll again, or subscribe to the run resource |
approve_gate |
Approve, using the payload schema in the answer |
resolve_claims |
get_article_claims, then resolve_claim |
edit_draft |
regenerate_section or update_article_body |
retry_run |
retry_pipeline_run |
blocked |
Quota or subscription; the answer says which |
done |
Stop |
draft_review refuses until the content score is 70 or higher, the SEO score is 80 or higher, and there are no critical SEO issues or unresolved claims. next_action lists the failing checks before you try, and a refused approval returns them one per line.
An approval made with a token is recorded as yours, tagged with the token.
Publishing
publish_article needs the publish scope and a connector whose status is ok. Test the connector first (GitHub, WordPress, Ghost, Webflow, Shopify, Wix, Notion, GoHighLevel, webhook).
A publish_date in the future schedules the publish instead of shipping it now. Omit it to publish immediately.
Limits
- 600 tool calls per hour, per token.
- 2 active runs per account, 30 articles per billing period.
- 5 keyword research runs per project per day; 3 sitemap imports per project per day.
- 4 concurrent sessions per token; a session with no traffic for 10 minutes closes.
Troubleshooting
401on connect - the bearer is missing, revoked, expired, or is an access token rather than absk_mcp_token.403on connect - a browserOriginheader that is nothttps://birchseek.com. Non-browser clients send noOriginand are fine.403on a message - thesessionIdbelongs to a different token. Open your own stream.-32001- a request arrived beforenotifications/initialized. Finish the handshake.gates_not_green- the draft is below the bar. The message lists every failing check.too_many_active_runs- two runs are already open. Finish or cancel one.quota_exceeded- the period’s 30 articles are spent. Parked runs resume when the next period opens.