{
  "$schema": "https://specky.space/schemas/agents.json",
  "schema_version": "2025-10-01",
  "name": "Specky",
  "display_name": "Specky — AI-native product workspace",
  "description": "Specky is an AI-native product development environment for Product Managers. Agents can search a workspace's Product Graph (Slack, Jira, Gong, GitHub, and research signals unified as typed nodes), read and create documents (PRDs, decisions, OKRs, experiments), create tickets and insights, run JTBD research campaigns, and execute or author custom workflows.",
  "homepage": "https://specky.space",
  "documentation": "https://specky.space/for-agents",
  "contact": {
    "email": "customer-support@specky.space",
    "security": "security@specky.space"
  },
  "legal": {
    "terms": "https://specky.space/terms",
    "privacy": "https://specky.space/privacy"
  },
  "logo": "https://specky.space/favicon.svg",
  "categories": ["product_management", "knowledge_graph", "research", "issue_tracking", "documents"],
  "authentication": {
    "type": "api_key",
    "scheme": "Bearer",
    "header": "Authorization",
    "key_prefix": "sk_live_",
    "key_acquisition_url": "https://specky.space/app?view=settings&section=developer",
    "instructions": "End users create a workspace API key in Specky → Settings → Developer. Keys are scoped to a single workspace. Pass the key as `Authorization: Bearer sk_live_…` on every request."
  },
  "interfaces": [
    {
      "type": "mcp",
      "status": "beta",
      "transport": "http+sse",
      "url": "https://specky.space/api/mcp",
      "description": "Model Context Protocol server. Exposes Specky's Product Graph, documents, tickets, research, and custom workflows as MCP tools so agents in Claude Desktop, Cursor, and other MCP clients can drive Specky natively."
    },
    {
      "type": "openapi",
      "status": "beta",
      "url": "https://specky.space/openapi.json",
      "description": "OpenAPI 3.1 specification for the public REST surface. Use this for code-gen clients or general HTTP agents."
    },
    {
      "type": "webhooks",
      "status": "beta",
      "url": "https://specky.space/app?view=settings&section=developer",
      "description": "Outbound webhooks on Product Graph events. Subscribe to document.created, insight.created, decision.created, experiment.created, opportunity.created, ticket.created, okr.created. Deliveries are HMAC-SHA256 signed via the X-Specky-Signature header (format: `t=<unix>,v1=<hex>`); compute over `<timestamp>.<rawBody>` with your per-webhook secret."
    },
    {
      "type": "llms_txt",
      "status": "stable",
      "url": "https://specky.space/llms.txt",
      "description": "LLM-friendly site index. Start here for context about what Specky is and what users can do with it."
    }
  ],
  "rate_limits": {
    "per_workspace": {
      "requests_per_minute": 120,
      "ai_generations_per_day": "plan-dependent"
    },
    "headers": {
      "limit": "X-RateLimit-Limit",
      "remaining": "X-RateLimit-Remaining",
      "reset": "X-RateLimit-Reset"
    }
  },
  "plan_enforcement": {
    "summary": "Every MCP and REST call runs through the same plan-gate Specky uses in-product. Reads are open to any workspace. Mutations require the workspace to be inside its plan quota and the explore window (free plan) to still be active.",
    "errors": {
      "rate_limited": { "http": 429, "rpc": -32002, "fields": ["retryAfterSec", "scope"] },
      "plan_required": { "http": 402, "rpc": -32003, "fields": ["plan", "used", "limit", "kind"] },
      "explore_expired": { "http": 402, "rpc": -32003, "fields": ["plan"] },
      "no_workspace": { "http": 404, "rpc": -32004 }
    },
    "quotas": {
      "free": { "ai_generations_per_month": 25, "research_campaigns_per_month": 5, "requires": "card on file after 14-day explore window" },
      "solo": { "ai_generations_per_month": 200, "research_campaigns_per_month": 10 },
      "pro": { "ai_generations_per_month": "unlimited", "research_campaigns_per_month": "unlimited" },
      "enterprise": { "ai_generations_per_month": "unlimited", "research_campaigns_per_month": "unlimited" }
    },
    "audit": "Every mutating call is logged to audit_logs (action=data.created, resource_type=<tool_name>) for SOC2 CC4.1."
  },
  "capabilities": [
    {
      "id": "search_workspace",
      "summary": "Hybrid ILIKE + pgvector search across the Product Graph.",
      "inputs": ["query", "source_types?", "limit?"],
      "outputs": ["nodes"]
    },
    {
      "id": "read_workspace_item",
      "summary": "Fetch a single graph node (document, ticket, insight, decision, OKR, etc.) by id.",
      "inputs": ["node_id"],
      "outputs": ["node"]
    },
    {
      "id": "create_document",
      "summary": "Create a PRD, research doc, or note. Auto-indexed into the Product Graph.",
      "inputs": ["title", "content_markdown", "type?"],
      "outputs": ["document_id", "url"]
    },
    {
      "id": "create_tickets",
      "summary": "Generate engineering tickets with acceptance criteria. Optionally push to Jira/Linear.",
      "inputs": ["context", "count?", "push_to?"],
      "outputs": ["tickets"]
    },
    {
      "id": "create_insight",
      "summary": "Record a customer insight, evidence-linked.",
      "inputs": ["title", "summary", "evidence_node_ids?"],
      "outputs": ["insight_id"]
    },
    {
      "id": "create_opportunity",
      "summary": "Add an opportunity to the Opportunity Tree under a chosen outcome.",
      "inputs": ["title", "description", "parent_id?"],
      "outputs": ["opportunity_id"]
    },
    {
      "id": "create_experiment",
      "summary": "Create an experiment (A/B test, fake door, prototype).",
      "inputs": ["hypothesis", "method", "success_metric"],
      "outputs": ["experiment_id"]
    },
    {
      "id": "create_decision",
      "summary": "Log a strategic decision with rationale.",
      "inputs": ["title", "rationale", "evidence_node_ids?"],
      "outputs": ["decision_id"]
    },
    {
      "id": "create_okr",
      "summary": "Create an OKR with key results tied to the Product Graph.",
      "inputs": ["objective", "key_results"],
      "outputs": ["okr_id"]
    },
    {
      "id": "start_research_session",
      "summary": "Spin up an Alex JTBD interview campaign with a shareable link.",
      "inputs": ["topic", "questions?"],
      "outputs": ["session_id", "share_url"]
    },
    {
      "id": "run_custom_workflow",
      "summary": "Execute a workspace-defined multi-step workflow.",
      "inputs": ["workflow_id", "parameters?"],
      "outputs": ["execution_id", "stream_url"]
    },
    {
      "id": "list_inbox",
      "summary": "List items awaiting human review in the PM Inbox.",
      "inputs": ["status?"],
      "outputs": ["items"]
    }
  ],
  "guidelines_for_agents": {
    "human_in_the_loop": "Specky is a PM workspace where humans approve drafts. Default to creating items in `draft` or `proposed` state and surface them in the PM Inbox unless the user explicitly approves auto-publish.",
    "citations": "When generating PRDs, decisions, or insights, link back to source graph nodes (`evidence_node_ids`) so users can audit your claims.",
    "destructive_actions": "Do not delete or archive workspace data without an explicit user instruction in the current turn.",
    "rate_limits": "Respect plan-based AI generation limits. If you receive 429, back off exponentially and inform the user.",
    "pii": "Treat all workspace data as confidential. Do not transmit graph node contents to third-party services that are not the user's own."
  }
}
