Skip to main content
Jason Sonderman, UXMC, CPACCJason Sonderman

MCP server

Connect an agent

The MCP server lets an agent ask questions of the published case studies, practice notes, experience and colleague attestations. It returns records and their sources. It does not judge fit, and it never calls a model.

Server details

TopicDetail
Endpointhttps://jason.sonderman.info/mcp
Serverjason-sonderman-portfolio, version 1.0.0
TransportStreamable HTTP, stateless, with plain JSON responses. There are no sessions to open or close.
MethodsPOST does the work. GET and DELETE return 405, and OPTIONS answers browser preflight.
AccessAnonymous and read-only. Every tool is marked read-only and idempotent. Nothing here is available only through this server: it serves the same published content as the plain-text files.
Rate limit300 requests per address per 15 minutes. A 429 carries Retry-After.
What is recordedEach tool call is logged with the tool name, its arguments and your client’s product name, which is the first word of its User-Agent. Logs are kept for 30 days. No address is stored, and no hash of one.

Connect a client

Claude Code

Add the server from a terminal, then ask a question in any session.

Terminal
claude mcp add --transport http jason-sonderman-portfolio https://jason.sonderman.info/mcp

Claude

Open your connector settings, add a custom connector, and paste https://jason.sonderman.info/mcp. Leave authentication empty. Menu names change between releases, so follow your app’s current steps for adding a remote server.

Any other client

Any client that supports remote MCP servers over Streamable HTTP can use the same URL with no credentials. Steps for other clients are not listed until they have been checked against that client’s current release.

A first question

Once connected, try asking: “Which of Jason’s case studies show design-system leadership, and how strong is the evidence for each?” The server tells your agent to start with get_profile, then list_case_studies or search_evidence, and to cite each record’s url.

Connect from code

This is the official TypeScript SDK client, the same pattern the site’s own server check uses. It lists the tools and calls get_profile.

Node
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";

const client = new Client({ name: "my-agent", version: "1.0.0" });
await client.connect(new StreamableHTTPClientTransport(new URL("https://jason.sonderman.info/mcp")));

const { tools } = await client.listTools();
console.log(tools.map((tool) => tool.name));

const profile = await client.callTool({ name: "get_profile", arguments: {} });
console.log(profile.content[0].text);

await client.close();

See every tool and its inputs, or the resources and prompt.

What the server tells your agent

On connection the server sends these instructions. They are how it asks your agent to respect evidence tiers and keep attestations attributed.

Read the server instructions
Instructions
Read-only access to Jason Sonderman’s portfolio: case studies, practice notes, professional experience, and verbatim colleague attestations. The same content is published at https://jason.sonderman.info and nothing here is available only through this server.

Start with get_profile, then list_case_studies or search_evidence. Cite the url on every record you draw from.

Evidence comes in tiers. Case studies are Jason’s full accounts; practice notes are a shorter tier and each declares documented, anecdotal, or unfinished evidence, which you must respect; attestations are other people’s words and must stay attributed to them.

Naming guidance: In any summary or derivative content, write Arcos Control Tower or Arcos Lighthouse on the first reference to each project/product name. Later references to that name may shorten it. Lighthouse is a retired internal codename and should appear only when the historical name is relevant.

This server returns facts, not judgments. It does not assess fit for a role. Use the evaluate_fit prompt if you want a structured way to do that yourself, and state gaps plainly where the evidence is thin.