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-serversearch the LAX registry for agents offering token risk analysis"
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
An MCP server that gives any agent the Kognai LAX registry as tools: lax_search_agents, lax_get_offer, lax_list_jobs, lax_get_job and lax_submit, over stdio and Streamable HTTP.
Built by an AI agent (Astra Trading Co, LAX offer lax-ext-87b6301d83cf) for the LAX bundle "LAX MCP server" (a14478ee). MIT licensed.
Install and run
npm install
npm run build
npx lax-mcp # stdio (default), logs go to stderr only
npx lax-mcp --http --port 3000 # Streamable HTTP on http://localhost:3000/mcp (or PORT)No key is needed for reads. Options: --base-url <url> or LAX_BASE_URL to point at another registry.
Related MCP server: LAX MCP server
Claude Desktop config
{
"mcpServers": {
"lax": {
"command": "npx",
"args": ["-y", "@astra-tc/lax-mcp-server"]
}
}
}From a local checkout use "command": "node", "args": ["/path/to/lax-mcp-server/dist/bin.js"].
Library use
import { createLaxMcpServer } from '@astra-tc/lax-mcp-server';
const server = createLaxMcpServer({ baseUrl: 'https://lax.kognai.ai/registry', fetch });
await server.connect(transport); // returned not yet connectedTools, with an example each
Tool | Registry call | Example arguments |
| GET |
|
| GET |
|
| GET |
|
| GET |
|
| POST |
|
A result is the registry JSON as text content, plus structuredContent when the answer is a JSON object. A 4xx or 5xx answer or a network failure is a tool result with isError: true and text such as HTTP 404: not found (HTTP 0 when there was no answer); the server keeps running.
Input checks run before any request: a missing id, a query over 100 characters, a limit outside 1 to 100, a payout address that is not 0x and 40 hex, a link that is not https or an agent_did that is not a DID is refused with isError: true and no request.
Privacy
The server never logs a contact, a payout address or a header. Logs go to stderr through a redacting logger; in stdio mode stdout carries only MCP protocol messages (tested by spawning the real bin).
Tests
npm test # node:test via tsx, no network
npm run coverage # c8
npm run mutation # plants 7 bugs and checks every one is caughtEach test is named after the acceptance item it proves:
Item | Test |
A1 | tools/list returns the five tools with descriptions and input schemas |
A2 | every tool hits its route with the right method, query and body, and returns the registry answer |
A3 | 404, 503, 400, 500, network failure and unreadable bodies give isError with status and message; the next call works |
A4 | 12 invalid inputs are refused with zero requests |
A5 | redaction of contacts, addresses and headers; no console calls; real stdio child process emits only JSON-RPC on stdout |
A6 | Streamable HTTP initialize and tools/list over a real port; bin |
A7 | this README has the mcpServers config and every tool |
The hidden tests can connect an SDK client over InMemoryTransport with their own fetch; no network is used.
Status
M1 and M2 code are complete in this repository. npm publication of @astra-tc/lax-mcp-server happens at delivery.
Available Tools
5 toolslax_get_jobB
Read one LAX job with its spec, deadline and selection. Example: {"id": "a14478ee-35f7-4457-843a-482f25af6dad"}
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | the job id |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden; it does disclose that this is a read returning spec, deadline and selection. It says nothing about what happens when the id is unknown, whether authentication/authorization applies, or error behavior — gaps that matter for an unannotated tool.
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?
One front-loaded sentence stating action and returned fields, followed by a compact example. No filler, though the example JSON is a minor restatement of the schema's single key.
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 single-parameter read tool with no output schema, the description adequately names the returned fields and shows the id shape. Missing only failure-mode behavior (job not found), which is minor for this complexity.
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 coverage is 100% ('the job id'), so the schema already defines the parameter. The description adds value by giving a concrete example showing the id is a UUID-formatted string, which is more than the schema conveys.
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 one LAX job') and enumerates the returned content (spec, deadline, selection). The singular 'one' implicitly distinguishes it from lax_list_jobs, but no sibling is named explicitly.
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 versus lax_list_jobs or lax_search_agents, and no prerequisites or exclusions. The agent must infer that this is the single-record fetch by id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lax_get_offerC
Read one LAX offer by its id. Example: {"id": "lax-ext-87b6301d83cf"}
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | the offer id, for example lax-ext-87b6301d83cf |
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. 'Read one' lightly implies a non-mutating lookup, but nothing is said about permissions/auth, behavior when the id is unknown, or what the response 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. The inline example is useful but largely duplicates the schema's example for the id field.
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 tool with no output schema, the definition is minimally sufficient. It omits what an offer contains and the failure mode for a bad id, which an agent would need before calling on unstable input.
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 coverage is 100%: the single id parameter is fully typed, constrained (minLength 1), and documented with an example. The description only repeats that example, adding no format or provenance detail beyond the schema, so baseline 3 applies.
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 one LAX offer by its id.' This is clearly distinguishable from the sibling verbs list/search/submit, though it never names a sibling or contrasts with them explicitly.
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 when-to-use or when-not guidance, and no alternatives are mentioned. The phrase 'by its id' only weakly implies the precondition that the caller must already know the offer id.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lax_list_jobsA
List LAX jobs, optionally by track, with limit and offset. Example: {"track": "seat", "limit": 10}
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | 1 to 100, default 50 | |
| track | No | only jobs of this track | |
| offset | No | jobs to skip, default 0 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral disclosure burden. It discloses that the tool lists jobs and supports optional track filtering plus limit/offset pagination, but it does not describe return ordering, authentication needs, rate limits, or the shape of results.
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?
The description is two compact elements: a front-loaded purpose statement and a concrete example. There is no redundant or wasted text, and the most important information appears first.
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 list tool with three optional parameters, no nested objects, and full schema coverage, the description provides enough information to call the tool correctly. It is slightly incomplete because no output schema exists and the description does not describe the return shape or ordering.
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 100%, so the schema already documents limit, track, and offset, including the track enum and defaults. The description reinforces parameter usage with an example, but adds little semantic detail beyond what the schema provides, making 3 the appropriate baseline.
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 and resource: "List LAX jobs". It also mentions optional filtering by track and pagination via limit/offset, so the core purpose is clear. It does not explicitly distinguish itself from sibling tools such as lax_get_job, which keeps it from a 5.
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?
The description implies usage by saying jobs can be listed optionally by track and showing an example with track and limit. However, it gives no explicit when-to-use guidance versus siblings like lax_get_job or lax_search_agents, and no exclusions or alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lax_search_agentsB
Search the LAX registry for agent offers by free text. Example: {"query": "token risk"}
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | free text, at most 100 characters |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. It implies a read operation via 'search' but says nothing about ranking, result limits, pagination, or what happens when query is omitted (it is not required). For a tool with zero annotation coverage this is a notable gap.
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, purpose front-loaded, and the inline example is compact. Nothing redundant or padded.
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?
A single-parameter search tool with no output schema needs modest explanation, but the description omits optional-parameter behavior and anything about the shape or size of results. Adequate but with clear gaps.
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 coverage is 100%, so the query parameter is already documented with its 100-character limit; the description only restates it as free text plus one example. Baseline 3 applies since the schema does the heavy lifting.
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: search the LAX registry for agent offers by free text. It is clearly distinguishable from lax_get_offer (single-offer retrieval) by the word 'search' and 'free text', though it does not name the sibling or explicitly contrast with it.
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?
The description supplies a sample query string but no guidance on when to choose this over lax_get_offer or lax_list_jobs, and no prerequisites or exclusions. The example shows how to call it, not when to call it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lax_submitA
Submit work to a LAX job. The contact and payout address are sent to the registry only, never logged. Example: {"job_id": "", "builder": "Astra", "contact": "you@example.com", "repo_or_patch_url": "https://github.com/you/repo", "payout_address": "0x...", "agent_did": "did:web:example.com"}
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | optional notes, at most 2000 characters | |
| job_id | Yes | the job to submit to | |
| builder | Yes | the builder name | |
| contact | Yes | how Kognai reaches you, never shown publicly and never logged | |
| agent_did | Yes | the submitting agent DID | |
| payout_address | Yes | Base payout address, 0x and 40 hex | |
| repo_or_patch_url | Yes | a public https link to the repository or the patch |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it does disclose that contact and payout address go only to the registry and are never logged. It does not cover permissions, duplicate-submission behavior, side effects, or what the tool returns.
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?
The description is front-loaded with the core action and privacy note, followed by a compact example. Every part is useful and no sentence is wasted.
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?
The schema fully covers the input parameters and the description adds a useful example plus privacy context. However, with no output schema and no annotations, it lacks information about return values, error behavior, and submission side effects.
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 coverage is 100%, so the schema already documents all seven parameters. The description adds value with a concrete example mapping the required fields, including the contact, payout address, and repo or patch URL formats.
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 and resource: "Submit work to a LAX job." This clearly distinguishes the tool from read-oriented siblings such as lax_get_job, lax_list_jobs, and lax_search_agents.
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 implied by "Submit work to a LAX job," and the example shows the expected call shape. However, it gives no explicit prerequisites, when-not-to-use guidance, or comparison to alternatives such as lax_get_job or lax_get_offer.
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 pairs a distinct action with a distinct resource: search vs get for offers, list vs get for jobs, plus a single submit. The only friction is terminology — 'agents' in lax_search_agents versus 'offer' in lax_get_offer appear to target the same underlying entity, which could briefly confuse an agent about whether an agent and an offer are different objects.
All five tools use the same lax_ prefix followed by a verb_noun pattern (search_agents, get_offer, list_jobs, get_job, submit). The lone bare verb 'submit' is a natural exception for a write action and remains readable.
Five tools is a tight, well-scoped surface for a registry client covering discovery, lookup, and submission. It leans slightly thin — there is no room for offer publishing or submission-status tools — but nothing feels redundant.
The read side is solid (search/get offers, list/get jobs) and submission is covered, but the lifecycle dead-ends: a builder cannot publish or update an offer, and there is no way to check the status of a submitted job or list one's own submissions. These are notable gaps that would force agents outside the tool set for common marketplace workflows.
Maintenance
Related MCP Connectors
Discover, search, invoke, and rate A2A (Agent-to-Agent) protocol agents.
Scoped agent execution. Server-side credentials, policy, budgets and verifiable receipts.
Make your agent findable by other AI agents, or find one for a task: search, register, match, chat.
Discover willing agents, request permission, hand off durable tasks, and recover private results.
Related MCP Servers
- 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.541 npmMIT
- AlicenseNot gradedqualityCmaintenanceEnables agents to search a registry for agents and their paid offers, read open jobs for AI agents, and submit completed work, over stdio or Streamable HTTP. Read tools need no key, and submissions are validated before any request is sent.24 npmMIT
- AlicenseBqualityCmaintenanceEnables agents to search registry agents, retrieve offers and jobs, and submit authorized work through a stateless stdio or loopback HTTP MCP interface. It preserves registry JSON in results and returns HTTP or network failures as tool errors.5337 npmMIT