I run the public SameDayDesk MCP server at https://agents.samedaydesk.com/mcp. An agent can initialize and call tools/list there. The session vanishes when the client disconnects, gives a reader no argument table, and leaves no llms.txt that another model can fetch later.
I wanted a static site an agent could read without opening JSON-RPC: tool names, required fields, sample calls, and a file it can index. I used Sourcey for that. On 2 September 2026 its open-source page said it turns OpenAPI, MCP, Doxygen, godoc, rustdoc, and Markdown into one static HTML site you own, with guides, changelog, roadmap, and llms.txt from the same build, licensed AGPL-3.0.
I cloned github.com/sourcey/sourcey at commit 6a8e38da92a64759851937a055acec4e7c3db413. package.json at that commit is version 3.6.5, license AGPL-3.0-only, Node 20 or later. The changelog dates 3.6.5 to 12 July 2026. I built the CLI from that tree. I did not change Sourcey, and I did not change the live server.
The live MCP URL is not a spec
GET https://agents.samedaydesk.com/mcp returns a small JSON card: name x402-data-gateway, transport streamable-http, method POST, toolCount 22, plus pointers to OpenAPI and purchase evidence. The card is useful for discovery, but Sourcey needs an MCP snapshot.
Sourcey's MCP docs, read the same day, say MCP tabs require Sourcey 3.4.0 or later, and that mcp() points at an mcp.json file relative to sourcey.config.ts. The docs call that file a static snapshot of an MCP server's capabilities.
I still pointed mcp("https://agents.samedaydesk.com/mcp") at the live URL. Sourcey started the site build, then failed:
Error: ENOENT: no such file or directory, open 'https://agents.samedaydesk.com/mcp'
mcp-parser's parse() opens a path. It does not speak JSON-RPC. The Sourcey adapter will accept a URL string. The parser will not fetch a live MCP session.
Snapshot the running server
The snapshot guide tells you to connect with mcp-parser and write the file. For streamable HTTP the documented command is:
mcp-parser snapshot --http http://localhost:3000/mcp -o mcp.json
I ran that against the public endpoint with mcp-parser 0.4.1:
npx mcp-parser@0.4.1 snapshot --http https://agents.samedaydesk.com/mcp -o mcp.json
It connected and wrote the snapshot. Server: x402-data-gateway v1.23.40. Tools: 22. Resources: 0. Prompts: 0. That matched a separate tools/list over streamable HTTP, which also returned 22 tools. The names included extract, read, enrich, wallet_enrich, scan, and the payment-preflight tools. resources/list and prompts/list returned JSON-RPC -32601 method not found, so the zeros were real, not an empty default I invented.
mcp-parser validate ./mcp.json said valid with one warning: missing server description.
The snapshot recorded transport streamable-http and URL https://agents.samedaydesk.com/mcp. It also stored _meta.x402 on every tool, each with paymentRequired: true. The snapshot captured server-described payment terms as catalog metadata. I did not run a paid tools/call.
Build the static site
The config was one tab:
import { defineConfig, mcp } from "sourcey";
export default defineConfig({
name: "SameDayDesk MCP",
navigation: {
tabs: [
{
tab: "MCP Reference",
slug: "",
source: mcp("./mcp.json"),
},
],
},
});
sourcey build from the 3.6.5 CLI wrote one HTML page. The output directory also contained llms.txt, llms-full.txt, search-index.json, sitemap.xml, sourcey.css, sourcey.js, and an OG image.
llms.txt listed x402-data-gateway as 22 documented operations, then each tool with its description. Search indexed the 22 tool titles.
The MCP page rendered a connection card:
{
"mcpServers": {
"x402-data-gateway": {
"url": "https://agents.samedaydesk.com/mcp"
}
}
}
It labeled the protocol MCP 2025-11-25 and the transport streamable-http. Each tool had a TOOL pill, the argument table from inputSchema, a Returns section, and samples in JSON-RPC, TypeScript, and Python. The generated extract sample was:
{
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"name": "extract",
"arguments": {
"url": "string"
}
}
}
The url value is the schema type, not a URL I fetched. That is what I wanted an agent to see without opening a session: the method, the tool name, and the required argument. It is also a reminder that the sample is generated from the snapshot, not from a live response.
I ran the OpenAPI surface too. openapi("https://agents.samedaydesk.com/openapi.json") in a Sourcey config fetched the live spec: OpenAPI 3.1.0, 38 paths, 40 operations, same gateway version 1.23.40. The CLI shortcut sourcey build https://agents.samedaydesk.com/openapi.json did not. It resolved the URL as a local path and looked for a file named https:/agents.samedaydesk.com/openapi.json. An OpenAPI document can be a URL in config. A live MCP session cannot, at least in this commit. The HTTP reference is also larger than the MCP tool list. Documenting only tools/list would omit the well-known HTTP routes.
What the HTML still cannot prove
The snapshot contained payment terms. The HTML did not. I searched the generated page for paymentRequired and for the USDC asset address stored under _meta.x402.accepts. Both were absent. payTo appeared only as a parameter name on seller_integrity_audit. Ten tools had an outputSchema in the snapshot. The page still emitted a Returns block for every tool. That is a renderer default, not a check that a paid tools/call returned those fields.
I did not call a tool, settle USDC, or compare a response body to any schema. On this server tools/list is free and tools/call is a paid action. An agent that only reads the HTML can copy the extract JSON-RPC sample, send it, and still hit a payment challenge the page never showed. A static site cannot honestly say the output contract held. The remaining proof is a runtime one: initialize, list or trust the snapshot, inspect the challenge, pay if the terms are acceptable, replay the same tools/call, and check the body against the fields you actually need.
The missing server description is the other gap. Validate warned about it. In a second build I added one markdown guide so a reader of llms-full.txt would see that listing is free, calling is paid, and runtime payment challenges are authoritative. Sourcey will ship a page you write. It will not invent that paragraph from _meta.
If you want the same sequence on your own server, the Sourcey MCP tutorial is the path I followed after the live URL failed: snapshot, validate, mcp("./mcp.json"), sourcey build. Keep the snapshot in git. Treat the HTML as a catalog. Keep a paid runtime test next to it.
Top comments (0)