MCP server for Common Thread: drive the full investigation API (create, seeds, ingest, attribute, packets) from an agent. Self-host or approved hosted backend.
Common Thread MCP demonstrates solid definition quality with 23 well-named tools following verb_noun conventions (create_investigation, list_seeds, get_packet). All tools have descriptions (avg ~120 chars, within 10-1024 baseline). Input schemas are present and use Zod with type definitions. However, output schemas are not documented, responses are inferred from handler implementations. Parameter descriptions are present but some lack format/constraint details (e.g., 'platform' in add_seed lacks enum values). Error handling exists but recovery guidance is minimal. Security is strong: credentials use environment variable injection (COMMON_THREAD_INVESTIGATION_ID, COMMON_THREAD_ACCESS_TOKEN), not tool parameters. Tool composition is excellent, each tool has one responsibility, and output IDs chain to downstream tools (e.g., create_investigation returns access_token used by all subsequent calls).
Add a seed account (platform + handle + basis_statement). Active only. Cap: MAX_SEED_ACCOUNTS.
Run attribution (async). Optionally filter by account/pair/category. BYOK: pass ai_gateway_url + anthropic_api_key or cf_aig_token.
Create a new investigation. Returns access_token ONCE -- store it; it cannot be recovered. New investigations are encrypted at rest; the key is derived from the token.
Debug ingest state (raw ingest rows, errors, etc.).
Debug manifest state (raw manifest rows, errors, etc.).
Hard-delete an ACTIVE investigation (MySQL rows + R2 investigation prefix). Sealed/archived refuse. sha256 blobs retained.
Output schemas not documented. Handlers return raw API responses without schema declarations. LLMs cannot predict response structure for downstream planning.
Parameter 'platform' in add_seed and list_features lacks enum constraint. Description says 'e.g. twitter' but does not enumerate valid platforms. LLMs may hallucinate invalid platform names.
Error handling returns raw CommonThreadError with optional body field. Recovery guidance is absent, LLMs do not know whether to retry, ask user, or abort.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 68 | 2026-07-28+ | v2 |
Poll attribution job status (POST /attribute returns job_id).
Poll ingest job status (POST /ingest/apify-twitter returns job_id).
Fetch investigation metadata and practitioner metadata.
Fetch a packet (JSON, Markdown, or PDF). Optionally filter by run_id, format, practitioner, redact, redact_accounts.
Fetch a single run (job_id, status, created_at, etc.).
Backend health check (GET /). Confirms API URL, version, and hosted-API notice.
Ingest Apify Twitter dataset (items array). Async job; poll with get_ingest_job.
Active seed count and manifest artifact count.
Query extracted features (account / pair / event) after ingest+extract.
List manifest artifacts (sha256 blobs, metadata, signatures).
List attribution runs (job_id, status, created_at, etc.).
List seed accounts for the investigation.
List signatures (ed25519 public keys, signed manifests).
Soft-delete an active seed (audit row retained).
Mark investigation read-only (sealed). Ingest and attribution disabled; data stays readable with the token.
PATCH practitioner metadata: triggering_events and/or time_bounds (paper §4.2.2 / §5.2.1). Active only.
Verify manifest signatures (ed25519 public keys vs. signed manifests).
Destructive tools (delete_investigation) lack confirmation/dry-run pattern. No mechanism to prevent accidental deletion of investigations.
List tools (list_seeds, list_features, list_runs) do not document pagination. No limit, offset, or cursor parameters visible. Large result sets may exhaust context.