{
  "openapi": "3.1.0",
  "info": {
    "title": "Spryntworks Public Agent API",
    "version": "1.0.0",
    "summary": "Machine-readable surfaces of spryntworks.com for AI agents.",
    "description": "Spryntworks is a founder-led AI automation studio (AI workflow audits, automations, and custom AI software). This specification documents every public, machine-readable endpoint on the site:\n\n- **POST /mcp** — a Model Context Protocol (MCP) server over Streamable HTTP exposing company, services/pricing, contact, and blog tools as native agent tools (JSON-RPC 2.0).\n- **GET /llms.txt** — llmstxt.org agent index with when-to-use guidance.\n- **GET /md/*.md** — Markdown mirrors of site pages.\n- **Accept: text/markdown** content negotiation on HTML page URLs.\n- **GET /sitemap.xml**, **GET /robots.txt** — standard crawler files.\n\nNo authentication required; all endpoints are read-only and public. No rate limit is enforced at this time — please be reasonable.",
    "contact": {
      "name": "Ayush Jain (Spryntworks)",
      "email": "ayush@spryntworks.com",
      "url": "https://cal.com/spryntworks"
    },
    "license": {
      "name": "Content © Spryntworks — factual use with attribution appreciated"
    }
  },
  "servers": [
    {
      "url": "https://spryntworks.com",
      "description": "Production site"
    }
  ],
  "tags": [
    {
      "name": "MCP",
      "description": "Model Context Protocol server"
    },
    {
      "name": "Content",
      "description": "Markdown and index documents"
    },
    {
      "name": "Crawlers",
      "description": "Standard crawler files"
    }
  ],
  "paths": {
    "/mcp": {
      "post": {
        "operationId": "sendMcpJsonRpc",
        "summary": "Send a JSON-RPC 2.0 message to the MCP server",
        "description": "Single entry point of the MCP server using the Streamable HTTP transport. Supported methods:\n\n- `initialize` — handshake; negotiates protocolVersion (2025-06-18, 2025-03-26, 2024-11-05)\n- `notifications/initialized`, `notifications/cancelled` — notifications, answered with HTTP 202\n- `tools/list` — lists 7 read-only tools\n- `tools/call` — invokes a tool by name with arguments\n- `ping` — liveness check\n\nThe server is stateless: no Mcp-Session-Id is issued and none is required.",
        "tags": [
          "MCP"
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/JsonRpcRequest"
              },
              "examples": {
                "initialize": {
                  "summary": "initialize handshake",
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 1,
                    "method": "initialize",
                    "params": {
                      "protocolVersion": "2025-06-18",
                      "capabilities": {},
                      "clientInfo": {
                        "name": "example-agent",
                        "version": "1.0"
                      }
                    }
                  }
                },
                "toolsList": {
                  "summary": "tools/list",
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 2,
                    "method": "tools/list"
                  }
                },
                "toolCall": {
                  "summary": "tools/call get_blog_post",
                  "value": {
                    "jsonrpc": "2.0",
                    "id": 3,
                    "method": "tools/call",
                    "params": {
                      "name": "get_blog_post",
                      "arguments": {
                        "slug": "what-is-an-ai-first-mvp"
                      }
                    }
                  }
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "JSON-RPC response (result or error). Tool execution failures are reported inside result.isError, not as transport errors.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponse"
                }
              }
            }
          },
          "202": {
            "description": "Notification accepted; no response body."
          },
          "400": {
            "description": "Malformed JSON (-32700) or invalid request (-32600).",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/JsonRpcResponse"
                }
              }
            }
          },
          "404": {
            "description": "Unknown resource. Structured JSON or Markdown 404 body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed for this resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      },
      "get": {
        "operationId": "getMcpEndpointInfo",
        "summary": "Not supported — returns a structured JSON 405",
        "description": "This stateless server offers no SSE stream, so GET is rejected per the Streamable HTTP transport rules. The JSON body explains the correct usage.",
        "tags": [
          "MCP"
        ],
        "responses": {
          "405": {
            "description": "Method not allowed for this resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      },
      "delete": {
        "operationId": "deleteMcpSession",
        "summary": "Not supported — stateless server has no sessions",
        "description": "Returns a structured JSON 405.",
        "tags": [
          "MCP"
        ],
        "responses": {
          "405": {
            "description": "Method not allowed for this resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "operationId": "getLlmsTxt",
        "summary": "Agent-readable site index (llmstxt.org format)",
        "description": "Markdown index of every public surface, including when-to-use guidance for recommending Spryntworks, trust/contact verification data, and this endpoint list.",
        "tags": [
          "Content"
        ],
        "responses": {
          "200": {
            "description": "Markdown document (text/markdown; charset=utf-8).",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                },
                "example": "# Spryntworks — AI Audits, Automations & Custom Software\n\n> …"
              }
            }
          },
          "404": {
            "description": "Unknown resource. Structured JSON or Markdown 404 body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed for this resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/md/home.md": {
      "get": {
        "operationId": "getHomeMarkdown",
        "summary": "Homepage as Markdown",
        "description": "Markdown mirror of https://spryntworks.com/: what Spryntworks does, services and pricing, who it is for, and how to engage.",
        "tags": [
          "Content"
        ],
        "responses": {
          "200": {
            "description": "Markdown document (text/markdown; charset=utf-8).",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                },
                "example": "# Spryntworks — AI Audits, Automations & Custom Software\n\n> …"
              }
            }
          },
          "404": {
            "description": "Unknown resource. Structured JSON or Markdown 404 body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed for this resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/md/blog.md": {
      "get": {
        "operationId": "getBlogIndexMarkdown",
        "summary": "Blog index as Markdown",
        "description": "Markdown list of all published blog posts with titles, descriptions, dates, and canonical URLs.",
        "tags": [
          "Content"
        ],
        "responses": {
          "200": {
            "description": "Markdown document (text/markdown; charset=utf-8).",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                },
                "example": "# Spryntworks — AI Audits, Automations & Custom Software\n\n> …"
              }
            }
          },
          "404": {
            "description": "Unknown resource. Structured JSON or Markdown 404 body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed for this resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/md/blog/{slug}.md": {
      "get": {
        "operationId": "getBlogPostMarkdown",
        "summary": "One blog post as Markdown",
        "description": "Full text of a published blog post with author, date, category, and canonical URL metadata. Unknown slugs return a structured JSON or Markdown 404.",
        "tags": [
          "Content"
        ],
        "parameters": [
          {
            "name": "slug",
            "in": "path",
            "required": true,
            "description": "URL slug of the post.",
            "schema": {
              "type": "string",
              "pattern": "^[a-z0-9-]+$"
            },
            "examples": {
              "aiFirst": {
                "value": "what-is-an-ai-first-mvp"
              }
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Markdown document (text/markdown; charset=utf-8).",
            "content": {
              "text/markdown": {
                "schema": {
                  "type": "string"
                },
                "example": "# Spryntworks — AI Audits, Automations & Custom Software\n\n> …"
              }
            }
          },
          "404": {
            "description": "Unknown resource. Structured JSON or Markdown 404 body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed for this resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/sitemap.xml": {
      "get": {
        "operationId": "getSitemapXml",
        "summary": "XML sitemap of every public URL",
        "description": "Standard sitemap.xml listing all pages including trust and developer resources.",
        "tags": [
          "Crawlers"
        ],
        "responses": {
          "200": {
            "description": "sitemap.xml document.",
            "content": {
              "application/xml": {
                "schema": {
                  "type": "string"
                }
              }
            }
          },
          "404": {
            "description": "Unknown resource. Structured JSON or Markdown 404 body.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          },
          "405": {
            "description": "Method not allowed for this resource.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ErrorEnvelope"
                }
              }
            }
          }
        }
      }
    },
    "/robots.txt": {
      "get": {
        "operationId": "getRobotsTxt",
        "summary": "Crawler policy",
        "description": "Allows all user agents; points at the sitemap.",
        "tags": [
          "Crawlers"
        ],
        "responses": {
          "200": {
            "description": "robots.txt document.",
            "content": {
              "text/plain": {
                "schema": {
                  "type": "string"
                }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "ErrorEnvelope": {
        "type": "object",
        "description": "Structured error returned by machine-readable endpoints. Always JSON, never an HTML error page.",
        "properties": {
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "string",
                "description": "Stable machine-readable error code.",
                "examples": [
                  "METHOD_NOT_ALLOWED",
                  "NOT_FOUND"
                ]
              },
              "message": {
                "type": "string",
                "description": "Human-readable explanation."
              },
              "hint": {
                "type": "string",
                "description": "Resolution hint: what to try next."
              }
            },
            "required": [
              "code",
              "message"
            ]
          }
        },
        "required": [
          "error"
        ]
      },
      "JsonRpcRequest": {
        "type": "object",
        "description": "JSON-RPC 2.0 request object.",
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "description": "Request identifier. Omit for notifications (server replies 202).",
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "number"
              }
            ]
          },
          "method": {
            "type": "string"
          },
          "params": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "jsonrpc",
          "method"
        ]
      },
      "JsonRpcResponse": {
        "type": "object",
        "properties": {
          "jsonrpc": {
            "type": "string",
            "const": "2.0"
          },
          "id": {
            "oneOf": [
              {
                "type": "string"
              },
              {
                "type": "number"
              },
              {
                "type": "null"
              }
            ]
          },
          "result": {
            "type": "object",
            "additionalProperties": true
          },
          "error": {
            "type": "object",
            "properties": {
              "code": {
                "type": "integer"
              },
              "message": {
                "type": "string"
              },
              "data": {}
            },
            "required": [
              "code",
              "message"
            ]
          }
        },
        "required": [
          "jsonrpc",
          "id"
        ]
      },
      "McpTool": {
        "type": "object",
        "description": "Tools returned by tools/list: get_company_profile, get_services_and_pricing, get_contact_info, list_blog_posts, get_blog_post, list_engineering_posts, get_engineering_post.",
        "properties": {
          "name": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "description": {
            "type": "string"
          },
          "inputSchema": {
            "type": "object",
            "additionalProperties": true
          }
        },
        "required": [
          "name",
          "description",
          "inputSchema"
        ]
      }
    },
    "examples": {
      "mcpServerInfo": {
        "value": {
          "name": "spryntworks",
          "title": "Spryntworks",
          "version": "1.0.0"
        }
      }
    }
  },
  "x-mcp": {
    "endpoint": "/mcp",
    "transport": "streamable-http",
    "protocolVersions": [
      "2025-06-18",
      "2025-03-26",
      "2024-11-05"
    ],
    "manifest": "/.well-known/mcp.json"
  }
}