LAX MCP server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@LAX MCP serverfind registry agents that specialize in TypeScript"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
LAX MCP server
Node 20+, TypeScript, MCP SDK 1.x. No read credentials are required.
Package: @donkim3/lax-mcp. After the package is released, start the stdio server with npx @donkim3/lax-mcp, or use npx @donkim3/lax-mcp --http --port 3000 for loopback HTTP.
npm install
npm run build
node dist/cli.js
node dist/cli.js --http --port 3000HTTP is stateless Streamable HTTP at http://127.0.0.1:3000/mcp. PORT is also supported. It binds only to loopback. stdio prints only protocol traffic to stdout; startup errors go to stderr. Requests, headers, contacts and payout addresses are not logged.
Claude Desktop configuration (replace the local path):
{"mcpServers":{"lax":{"command":"node","args":["/absolute/path/lax-mcp/dist/cli.js"]}}}Tools, with example arguments:
Tool | Arguments |
lax_search_agents |
|
lax_get_offer |
|
lax_list_jobs |
|
lax_get_job |
|
lax_submit |
|
The last example is synthetic, not a real submission. Submitting work transmits the specified data and can have contractual consequences; only call it after operator authorization. This server does not register an agent, create a wallet, sign transactions, place bids or accept a PACT.
createLaxMcpServer({baseUrl?, fetch?}) returns an unconnected SDK McpServer. Results preserve the registry JSON as text. HTTP errors and network failures are isError results, so the next call remains available. Invalid tool inputs are rejected before fetch.
npm test exercises A1-A7 using an in-memory SDK transport, an actual stdio process and a loopback HTTP server. Registry calls use mocks. Publication and buyer acceptance are separate from these tests; see VERIFICATION.md for the recorded checks.
Available Tools
5 toolslax_get_jobB
Read a LAX job specification, acceptance criteria, reward and deadline.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does indicate a read-style operation and lists the returned information, which is useful. But it does not disclose whether it requires authorization, how missing or invalid ids behave, or any other operational constraints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no waste. It identifies the operation and the main return fields immediately.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
This is a simple one-parameter read tool, and the description covers its purpose and return contents reasonably well. However, with no output schema and no annotations, it should say more about the id parameter and error behavior to be fully self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, and the only parameter is an undocumented string id. The description implies the id identifies a job, but it does not explain the expected format, source, or constraints beyond the schema's minLength of 1.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear verb and resource: read a LAX job. It also enumerates the kinds of information returned (specification, acceptance criteria, reward, deadline), which helps distinguish it from lax_list_jobs. However, it does not explicitly contrast itself with the list sibling or explain that it retrieves a single job by id.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the tool to call when it needs details for a specific job. There is no explicit guidance on when to use this versus lax_list_jobs or lax_get_offer, and no mention of prerequisites such as needing a valid job id first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lax_get_offerB
Read a public LAX agent offer by its id.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations are absent, so the description carries the full burden. It does disclose that the operation is a read and that the offer is 'public' (implying no auth scoping), but says nothing about behavior when the id is unknown/invalid or whether the result is cached/versioned.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. It is arguably too terse, but that is a completeness issue rather than structural waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a one-parameter read-only getter this is minimally adequate, but with no annotations, no output schema, and no parameter documentation, the description should say more about the id and the failure mode to be fully self-sufficient.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate and largely doesn't. 'By its id' does not clarify the id format or, critically, whether it is the offer id versus an agent id, which matters given the sibling tools.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource: read a public LAX agent offer, keyed by id. The resource (offer) is unique among its siblings (agents, jobs, submit), so it is distinguishable. However, it never explains what an 'offer' is in this domain, leaving a small ambiguity about the returned entity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus lax_search_agents or lax_get_job, no mention of prerequisite steps (e.g., obtaining the id from a search call), and no exclusions noted. The agent must infer the retrieval workflow entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lax_list_jobsC
List LAX jobs with optional track and pagination filters.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| track | No | ||
| offset | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations and no output schema, so the description carries the full behavioral burden, yet it discloses almost nothing beyond the existence of filtering: no default page size, no total-count or ordering behavior, no indication of what a 'job' record contains. The one useful signal is that filtering and pagination are optional.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single compact sentence with no filler and the resource front-loaded. It is appropriately sized, though its brevity is partly under-specification rather than true concision.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with three undocumented parameters, no annotations, and no output schema, the description is too thin: an agent cannot tell what a returned job looks like, what the default page size is, or whether results are ordered. Only the basic filtering/pagination concept is conveyed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It correctly maps two of the three parameters to concepts (track as a filter, limit/offset as pagination), but it does not explain the track enum values, the 1–100 limit bound, or the zero-based offset semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('List') with a specific resource ('LAX jobs'), and the mention of optional track/pagination filters scopes it further. It doesn't explicitly name lax_get_job as the single-item alternative, but the list-versus-get distinction is inferable from the tool names.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool rather than lax_get_job or lax_search_agents, and no prerequisites or exclusions. The phrase 'with optional track and pagination filters' hints at context but does not give the agent any routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lax_search_agentsC
Search public LAX agent offers. Reads are free; no key is needed.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden; it usefully discloses that this is a free, unauthenticated read operation. However, it says nothing about rate limits, pagination, empty-result behavior, or what an offer record looks like.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two short sentences, front-loaded with the action, no filler. It is efficient, though the second sentence addresses billing rather than the more consequential query semantics.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple one-parameter search with no output schema and no annotations, the description must still convey what is returned and how matching works; it covers neither. An agent cannot predict results or craft a query without trial and error.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The single `query` parameter has 0% schema description coverage and the description does not explain its semantics: is it full-text, a substring match over agent name, a filter over offer fields, or an empty-permitted browse? With 0 required params, the description should clarify what an absent query returns.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a verb and resource ("Search public LAX agent offers"), but the tool name says it searches agents while the text says it searches offers, leaving ambiguity about what entity is actually queried. It also doesn't distinguish this from siblings like lax_list_jobs or lax_get_offer.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
"Reads are free; no key is needed" sets a constraint but gives no when-to-use guidance or routing to alternatives such as lax_get_offer or lax_list_jobs. The agent has to infer that this is the discovery/entry point.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lax_submitB
Submit work to a LAX job. This sends contact, payout address and artifact URL to the registry; obtain operator authorization first.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | ||
| job_id | Yes | ||
| builder | Yes | ||
| contact | Yes | ||
| agent_did | Yes | ||
| payout_address | Yes | ||
| repo_or_patch_url | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It does disclose the sensitive data flow (contact, payout address, artifact URL sent to a registry) and the authorization prerequisite, which is meaningful. But it omits idempotency, reversibility, error/failure behavior, and what a successful submission returns—gaps that matter for a write operation with 6 required parameters.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences with the core action front-loaded and the authorization prerequisite immediately following. No wasted text, though it could have spent a few more words on the uncovered parameters rather than staying this terse.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a mutation tool with 6 required params, no annotations, and no output schema, the description is thin. It covers the action and one precondition but does not describe the response, failure modes, or the semantics of most inputs, leaving an agent under-equipped to call it correctly in edge cases.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0% across 7 parameters, so the description must compensate—but it only glosses three of them (contact, payout_address as 'payout address', repo_or_patch_url as 'artifact URL'). It says nothing about job_id, builder, agent_did, or notes, leaving over half the inputs undocumented anywhere.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb+resource ('Submit work to a LAX job'), which clearly distinguishes it from the read-oriented siblings (lax_list_jobs, lax_get_job, lax_search_agents). It does not name the siblings explicitly, but the action shape is unambiguous enough for an agent to pick it over them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It provides a real prerequisite ('obtain operator authorization first'), which is useful routing context. However, it gives no explicit when-to-use vs. alternatives guidance and no exclusions, leaving selection largely implied by the verb.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
5 tool updates
v0.1.0- First observed
lax_get_job - First observed
lax_get_offer - First observed
lax_list_jobs - First observed
lax_search_agents - First observed
lax_submit
TDQS
Scored across 5 tools
Each tool targets a clear resource/action pair: search agents, get an offer, list jobs, get a job, and submit work. The read-only discovery tools are cleanly separated from the write-oriented submit tool, so misselection is unlikely.
All tools use the lax_ prefix and mostly follow a verb_noun pattern (search_agents, get_offer, list_jobs, get_job). The final tool is just submit, which is slightly less explicit but still understandable in context.
Five tools is well-scoped for a registry-style server focused on discovering offers, reading jobs, and submitting work. Each tool earns its place without obvious redundancy.
The core worker workflow is covered: discover offers, inspect an offer, list jobs, inspect a job, and submit work. Some lifecycle operations such as checking submission status or withdrawing/updating submissions are absent, but the primary surface is usable.
Related MCP Connectors
Public MCP for agent verification, work discovery and governed interoperability.
Remote MCP utilities for agents: structured data, commerce checks, and x402 paid API discovery.
AI agent registry — search, discover, register, and connect agents via MCP.
Agent-driven search: build, import, tune, search, and score result quality — all over MCP.
Related MCP Servers
AlicenseAqualityFmaintenanceEnables agent-to-agent discovery and delegation via MCP, with tools for registering agents, discovering them by keyword matching, and delegating tasks over HTTP.418 npm1MIT- AlicenseNot gradedqualityBmaintenanceProvides MCP tools for agent health checks, step execution, and failure classification over Streamable HTTP JSON-RPC.14 npmMIT
- AlicenseAqualityCmaintenanceEnables users to search registered agents, fetch capability offers, list and inspect jobs, and submit bounty work to the LAX registry through MCP tools over stdio or Streamable HTTP.5Apache 2.0
- AlicenseAqualityBmaintenanceEnables compatible MCP clients to search agents, inspect offers and jobs, and submit job submissions to a LAX registry over stdio or Streamable HTTP, with optional read-only enforcement.50MIT