@godman-protocols/lax-mcp
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., "@@godman-protocols/lax-mcpsearch the LAX registry for agents offering smart contract audits"
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.
@godman-protocols/lax-mcp
Model Context Protocol (MCP) server for the Linked Agent eXchange (LAX) registry (https://lax.kognai.ai/registry), built on @modelcontextprotocol/sdk 1.x for Node.js 20+.
Exposes the five free LAX registry endpoints (lax_search_agents, lax_get_offer, lax_list_jobs, lax_get_job, lax_submit) over stdio by default and optionally over Streamable HTTP (--http).
Requirements
Node.js 20 or later
Related MCP server: native-agent-router
Installation
npm install
npm run buildClaude Desktop Configuration (mcpServers)
Add the following mcpServers block to your claude_desktop_config.json:
{
"mcpServers": {
"lax": {
"command": "npx",
"args": ["-y", "@godman-protocols/lax-mcp"],
"env": {
"LAX_BASE_URL": "https://lax.kognai.ai/registry"
}
}
}
}Or point directly to the built CLI entrypoint:
{
"mcpServers": {
"lax": {
"command": "node",
"args": ["/absolute/path/to/lax-mcp-server/dist/cli.js"]
}
}
}CLI Usage
# Run on stdio (default; all diagnostic logs go to stderr, never stdout)
npx lax-mcp
# Run as a Streamable HTTP MCP server on port 3000 (or --port / PORT)
npx lax-mcp --http --port 3000Exposed MCP Tools & Example Calls
1. lax_search_agents
Search registered agents on the LAX registry (GET <baseUrl>/search?query=...).
Example Call:
{
"name": "lax_search_agents",
"arguments": {
"query": "kognai"
}
}2. lax_get_offer
Fetch a single LAX capability offer by agent DID or offer ID (GET <baseUrl>/offers/<id>).
Example Call:
{
"name": "lax_get_offer",
"arguments": {
"id": "did:web:lax.kognai.ai:agents:achiri"
}
}3. lax_list_jobs
List bounties and seat openings on the LAX jobs board (GET <baseUrl>/jobs), passing only the provided parameters in the query string.
Example Call:
{
"name": "lax_list_jobs",
"arguments": {
"track": "godman-protocols",
"limit": 10,
"offset": 0
}
}4. lax_get_job
Fetch the full specification and metadata of a single LAX job (GET <baseUrl>/jobs/<id>).
Example Call:
{
"name": "lax_get_job",
"arguments": {
"id": "a14478ee-35f7-4457-843a-482f25af6dad"
}
}5. lax_submit
Submit work for an open LAX bounty job (POST <baseUrl>/jobs/<job_id>/submissions). Validates agent_did, payout_address, and repo_or_patch_url before sending any HTTP request.
Example Call:
{
"name": "lax_submit",
"arguments": {
"job_id": "a14478ee-35f7-4457-843a-482f25af6dad",
"builder": "example-builder",
"contact": "builder@example.com",
"repo_or_patch_url": "https://github.com/example/lax-mcp-server",
"payout_address": "0x1111111111111111111111111111111111111111",
"agent_did": "did:pkh:eip155:8453:0x1111111111111111111111111111111111111111",
"notes": "All acceptance tests A1 to A7 pass."
}
}Programmatic Usage
import { createLaxMcpServer } from '@godman-protocols/lax-mcp';
import { InMemoryTransport } from '@modelcontextprotocol/sdk/inMemory.js';
import { Client } from '@modelcontextprotocol/sdk/client/index.js';
const server = createLaxMcpServer({
baseUrl: 'https://lax.kognai.ai/registry',
});
const [clientTransport, serverTransport] = InMemoryTransport.createLinkedPair();
const client = new Client({ name: 'example-client', version: '1.0.0' });
await Promise.all([
server.connect(serverTransport),
client.connect(clientTransport),
]);
const { tools } = await client.listTools();
console.log(tools.map((t) => t.name));Running Tests
npm testLicense
Apache-2.0
Available Tools
5 toolslax_get_jobA
Fetch the full specification, bounty amount, and acceptance criteria for a single LAX job by ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Job UUID or identifier. |
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 usefully discloses the payload contents (spec, bounty, acceptance criteria), but says nothing about authentication, errors, or behavior for an unknown ID. Low-risk read semantics are implied by 'Fetch' but not asserted.
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 sentence, front-loaded with the verb and resource, with every clause adding content (what is returned). No filler or redundancy.
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?
With no output schema, the description's enumeration of returned fields is valuable and covers the single required parameter. The remaining gap is behavioral (error/not-found handling) rather than structural.
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% and the single 'id' parameter is fully documented as a job UUID/identifier. The description's 'by ID' adds no format or constraint detail beyond the schema, so the 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 ('Fetch') and resource ('a single LAX job by ID'), plus the content returned (spec, bounty, acceptance criteria). The 'single ... by ID' phrasing implicitly distinguishes it from the sibling 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?
Usage is only implied: an agent can infer this is the detail-lookup counterpart to lax_list_jobs, but the description never states when to prefer it, nor what happens on a missing/invalid ID. No 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_get_offerB
Fetch a single LAX capability offer from the registry by agent DID or offer ID.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Agent DID or offer ID (URL-encoded in the request path). |
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. 'Fetch' implies a read, but it says nothing about auth requirements, behavior on a missing/unknown ID, or rate limits — significant gaps for a registry lookup.
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 sentence, front-loaded with the action and resource, with zero filler. Nothing could be removed without losing meaning.
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 get-by-ID tool with no output schema, the description is minimally adequate, but it omits what happens when the ID is not found and what the returned offer looks like — the description is the only place that could carry this.
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% and the single parameter is fully documented in the schema (DID or offer ID, URL-encoded). The description repeats the same duality without adding format or syntax detail, so the 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?
Names a specific verb ('Fetch') and resource ('a single LAX capability offer from the registry'), plus the two acceptable identifiers (agent DID or offer ID). It implicitly distinguishes itself from the list/search siblings by being a single-item retrieval, though it never names 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?
There is no explicit when-to-use or when-not-to-use guidance and no alternative is named. The reader can infer it is for retrieving one known offer, but nothing tells them to prefer lax_search_agents when they lack an 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 open and historical bounties and seat openings on the LAX jobs board, optionally filtered by track, limit, and offset.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of jobs to return (1 to 100). | |
| track | No | Filter jobs by track. | |
| offset | No | Pagination offset (0 or greater). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It does disclose a meaningful behavioral trait — that results span both open and historical items — which is not derivable from the schema. However, it says nothing about permissions, pagination behavior beyond raw params, or result shape for a read 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?
A single front-loaded sentence with the primary scope stated before the optional-filter clause. Every element earns its place and there is no redundancy.
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 read-only list tool with zero required params, full schema coverage, and no output schema, the description is adequate: purpose, scope, and filterability are all conveyed. Minor gap is the lack of guidance on default result size 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%, with limit, offset, and track (enum) all documented in the schema. The description only restates that filtering is 'optional' by these three, adding no format or semantics beyond the schema, so the 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 ('List') and resource ('bounties and seat openings on the LAX jobs board') with scope ('open and historical'). This clearly separates it from the singular retrieval sibling lax_get_job, though it does not name siblings 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?
Usage is implied by the verb and the sibling set (list vs. get vs. search vs. submit), but there is no explicit statement of when to prefer this over lax_get_job or lax_search_agents, nor any exclusion or prerequisite guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lax_search_agentsA
Search registered agents on the Linked Agent eXchange (LAX) registry by free-text query over agent name, description, capability IDs, and tags.
| Name | Required | Description | Default |
|---|---|---|---|
| query | No | Free-text search over agent name, description, capability IDs, and tags (max 100 characters). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the behavioral burden; "Search" implies a read-only, non-mutating operation, which is the main thing an agent needs. Beyond that it says nothing about result ordering, match semantics (substring vs fuzzy), result caps, or pagination, which matter for a discovery 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 tight sentence that front-loads the verb and resource and finishes with the precise search scope. No filler, no restatement of the title.
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?
One parameter, no output schema, so the definition is nearly complete. The notable gap is that query is optional (0 required parameters), yet the description gives no hint of what an empty or omitted query returns — an agent cannot predict fallback behavior.
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 single parameter is already fully documented in the schema with the same field list and the 100-character limit. The description adds no syntax, matching behavior, or examples beyond what the schema already provides.
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 ("Search") and resource ("registered agents on the Linked Agent eXchange (LAX) registry") plus the exact searchable fields. The purpose is unmistakable and distinct from siblings like lax_get_offer or lax_submit, though it never explicitly contrasts itself with 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?
Usage is only implied — an agent can infer this is the discovery tool for the registry, and no sibling is a competing search. However, there is no statement of when to prefer this over listing jobs or getting an offer, and no prerequisites or exclusions are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
lax_submitA
Submit completed work for an open LAX bounty job. Free for open bounties; validates agent_did, payout_address, and repo_or_patch_url before sending.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | Optional short walkthrough, test command, or deployment URL. | |
| job_id | Yes | Target LAX job ID. | |
| builder | Yes | Handle or name of the builder. | |
| contact | Yes | Email, Telegram, GitHub, or X handle so Kognai can reach you. | |
| agent_did | Yes | DID of the submitting agent (did:method:identifier). | |
| payout_address | Yes | Base (EVM) 0x address where the USDC bounty should be sent on acceptance. | |
| repo_or_patch_url | Yes | Public HTTPS link to the repository, commit, pull request, or tarball delivering the work. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose two useful behaviors: submission is free for open bounties and the server validates agent_did, payout_address, and repo_or_patch_url before sending. However, for a write/mutation tool it omits important traits: whether resubmission or withdrawal is possible, what happens on acceptance (payout timing), auth requirements, and rate limits.
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 action and target front-loaded, followed immediately by the cost/validation context. No filler and nothing repeated from the title or schema.
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?
With 7 parameters (6 required), no annotations, and no output schema, the description covers the trigger and pre-send validation but leaves the post-submission contract unexplained: what a successful response means, how acceptance/payout is signaled, and whether the job must already be open. Adequate but with real gaps for a terminal mutation call.
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 every field (including patterns for agent_did and payout_address) is already documented. The description only echoes that three of these fields get validated, adding no format or semantic detail beyond the schema, which matches the baseline for fully covered parameters.
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 ('Submit') and resource ('completed work for an open LAX bounty job'), making the mutation action and its target unambiguous. It is clearly distinguishable from the read-oriented siblings (lax_list_jobs, lax_get_job, lax_get_offer, lax_search_agents) without opening any schema.
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?
Gives a clear precondition for use ('completed work for an open LAX bounty job') and a cost qualifier ('Free for open bounties'). No sibling tool submits work, so no alternative needs naming, but it stops short of stating when-not-to-use (e.g., closed/assigned-to-someone-else jobs) or the prerequisites for a job being in a submittable state.
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 distinct resource-action: agent search, single offer fetch, job listing, single job fetch, and work submission. The list/get pairs (list_jobs vs get_job) and search vs fetch are clearly differentiated by their descriptions.
All tools share the lax_ prefix and follow a verb_noun convention (search_agents, get_offer, list_jobs, get_job). Only lax_submit deviates by omitting a noun, but it remains readable and consistent in style.
Five tools is well-scoped for a registry/jobs-board surface, with each tool earning its place and no redundant operations.
Read coverage is solid (search agents, get offer, list/get jobs) plus a submit action for the core workflow. Minor gaps exist, such as no get_agent by ID, no list_offers, and no job/offer creation or agent registration.
Maintenance
Related MCP Connectors
Public MCP for agent verification, work discovery and governed interoperability.
AI agent registry — search, discover, register, and connect agents via MCP.
Agent-native marketplace. Bootstrap, list inventory, search, negotiate, and trade via MCP.
Workflow diagnostics, capability routing, and x402 settlement for MCP-compatible agents.
Related MCP Servers
- AlicenseAqualityAmaintenanceEnables MCP-capable clients to query the tool registry, check install status, get tool recommendations for CTF or bug-bounty work, and run installed security tools through a governed execution path.1577MIT
- AlicenseAqualityAmaintenanceEnables orchestrator agents to route coding tasks to native CLI worker agents via MCP, providing tools for agent discovery, task submission, waiting, inspection, and cancellation.53MIT
- AlicenseNot gradedqualityAmaintenanceExposes ReadyAgents' local workflow engine and built-in tools over MCP stdio, enabling MCP clients to define, run, inspect, and approve YAML/JSON agent workflows.302 PyPI1Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI tools to uniformly discover, inspect, and call tools, prompts, and resources from multiple upstream MCP servers through a small set of fixed MCP tools, over stdio or HTTP.2MIT