Skip to main content
Glama

@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 build

Claude 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 3000

Exposed 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 test

License

Apache-2.0

Available Tools

5 tools
lax_get_jobA

Fetch the full specification, bounty amount, and acceptance criteria for a single LAX job by ID.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesJob UUID or identifier.

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesAgent DID or offer ID (URL-encoded in the request path).

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of jobs to return (1 to 100).
trackNoFilter jobs by track.
offsetNoPagination offset (0 or greater).

TDQS

A3.6/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoFree-text search over agent name, description, capability IDs, and tags (max 100 characters).

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOptional short walkthrough, test command, or deployment URL.
job_idYesTarget LAX job ID.
builderYesHandle or name of the builder.
contactYesEmail, Telegram, GitHub, or X handle so Kognai can reach you.
agent_didYesDID of the submitting agent (did:method:identifier).
payout_addressYesBase (EVM) 0x address where the USDC bounty should be sent on acceptance.
repo_or_patch_urlYesPublic HTTPS link to the repository, commit, pull request, or tarball delivering the work.

TDQS

A3.9/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 5 tool updatesv0.1.0
    • First observedlax_get_job
    • First observedlax_get_offer
    • First observedlax_list_jobs
    • First observedlax_search_agents
    • First observedlax_submit

TDQS

A3.7/5.0

Scored across 5 tools

Disambiguation5/5

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.

Naming Consistency4/5

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.

Tool Count5/5

Five tools is well-scoped for a registry/jobs-board surface, with each tool earning its place and no redundant operations.

Completeness4/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers