wais-mcp
Enables Windsurf (by Codeium) to interact with any WAIS-compatible website, providing tools for discovery, registration, execution, confirmation, and status checking.
Enables CrewAI agents to interact with any WAIS-compatible website via the Python SDK, providing tools for discovery, registration, execution, confirmation, and status checking.
Enables GitHub Copilot (VS Code) to interact with any WAIS-compatible website, providing tools for discovery, registration, execution, confirmation, and status checking.
Enables LangChain agents to interact with any WAIS-compatible website via the Python SDK, providing tools for discovery, registration, execution, confirmation, and status checking.
Enables OpenAI's ChatGPT and SDK to interact with any WAIS-compatible website, providing tools for discovery, registration, execution, confirmation, and status checking.
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., "@wais-mcpdiscover actions on serphub.deeger.io"
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.
wais-mcp
Universal MCP server for WAIS (Web Agent Interaction Standard) — 5 generic tools that work with any WAIS-compatible site.
Works with Claude, ChatGPT, Gemini, Cursor, Windsurf, VS Code Copilot, and any MCP-compatible client.
Tools
Tool | Description |
| Fetch a site's |
| Register at a site using SD-JWT selective disclosure |
| Execute any action (search, subscribe, purchase, etc.) |
| Confirm high-risk actions or complete payments (402 flow) |
| Check account status, plan, and credits |
Related MCP server: Wisdom MCP
Quick Start
pip install wais-mcp
wais-mcp initThe setup wizard will ask you to pick your provider (Claude, ChatGPT, Cursor, etc.), choose project or global scope, and enter your API key. It writes the correct config file automatically.
Manual Setup by Provider
If you prefer to configure manually, all providers use the same wais-mcp command — only the config file location and format differ.
Claude Desktop
File: claude_desktop_config.json
{
"mcpServers": {
"wais": {
"command": "wais-mcp",
"env": {
"PLATFORM_URL": "https://pod.deeger.io",
"WAIS_API_KEY": "<your-api-key>"
}
}
}
}Claude Code
File: .mcp.json (project root) or ~/.claude/settings.json (global)
{
"mcpServers": {
"wais": {
"command": "wais-mcp",
"env": {
"PLATFORM_URL": "https://pod.deeger.io",
"WAIS_API_KEY": "<your-api-key>"
}
}
}
}ChatGPT Desktop
Requires Developer Mode: Settings > Advanced Settings > Developer Mode.
File locations:
macOS:
~/Library/Application Support/ChatGPT/mcp-server-config.jsonWindows:
%APPDATA%\OpenAI\ChatGPT\mcp-server-config.jsonLinux:
~/.config/ChatGPT/mcp-server-config.json
{
"mcpServers": {
"wais": {
"command": "wais-mcp",
"env": {
"PLATFORM_URL": "https://pod.deeger.io",
"WAIS_API_KEY": "<your-api-key>"
}
}
}
}Restart ChatGPT after saving.
Gemini CLI
File: ~/.gemini/settings.json (global) or .gemini/settings.json (project)
{
"mcpServers": {
"wais": {
"command": "wais-mcp",
"env": {
"PLATFORM_URL": "https://pod.deeger.io",
"WAIS_API_KEY": "<your-api-key>"
}
}
}
}Cursor
File: .cursor/mcp.json (project) or ~/.cursor/mcp.json (global)
{
"mcpServers": {
"wais": {
"command": "wais-mcp",
"env": {
"PLATFORM_URL": "https://pod.deeger.io",
"WAIS_API_KEY": "<your-api-key>"
}
}
}
}Windsurf
File: ~/.codeium/windsurf/mcp_config.json
Or open from Windsurf: click MCPs icon in Cascade panel > Configure.
{
"mcpServers": {
"wais": {
"command": "wais-mcp",
"env": {
"PLATFORM_URL": "https://pod.deeger.io",
"WAIS_API_KEY": "<your-api-key>"
}
}
}
}VS Code (GitHub Copilot)
File: .vscode/mcp.json (project) or via Command Palette: MCP: Open User Configuration (global)
{
"servers": {
"wais": {
"type": "stdio",
"command": "wais-mcp",
"env": {
"PLATFORM_URL": "https://pod.deeger.io",
"WAIS_API_KEY": "<your-api-key>"
}
}
}
}Note: VS Code uses
serversinstead ofmcpServers, and requires thetypefield.
Usage without MCP (Python SDK)
For custom agents, scripts, or any Python code — no MCP client needed:
import asyncio
from wais_mcp import WAISClient
async def main():
client = WAISClient(api_key="your-api-key")
# 1. Discover what the site offers
site = await client.discover("https://serphub.deeger.io")
print(site.name, site.list_action_ids())
# 2. Register (shares only required claims via SD-JWT)
await client.register(site)
# 3. Execute actions
result = await client.execute(site, "search", {"query": "python"})
print(result)
# 4. Confirm high-risk actions (if 402 returned)
# result = await client.confirm(site, challenge_id)
# 5. Check account status
status = await client.status(site)
print(status)
asyncio.run(main())Works with OpenAI SDK, LangChain, CrewAI, or any Python agent framework.
How It Works
Discover — Fetches
/.well-known/agents.jsonfrom a siteRegister — Shares only required claims via SD-JWT selective disclosure
Execute — Handles tokens, DPoP, endpoint resolution, and async polling automatically
Confirm — Polls for completion after 402 confirmation challenges
Status — Check credits and plan info
All authentication (PoD tokens, DPoP proofs) is handled transparently.
Configuration
Env Var | Default | Description |
|
| WAIS Provider URL |
| (keychain fallback on macOS) | API key from provider dashboard |
Development
pip install -e ".[dev]"License
MIT
Available Tools
5 toolswais_confirmA
Confirm a high-risk action or complete a payment challenge.
Call after wais_execute returned a 402 confirmation challenge and the user has approved. If there was a payment link, the user must complete payment first. Polls for completion automatically if the challenge included a resolution object.
Args: site_url: The site.url from agents.json. challenge_id: The challenge_id from the 402 response.
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | Yes | ||
| challenge_id | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | 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 burden. It discloses that the tool polls for completion automatically if the challenge includes a resolution object. It implies a write/confirmation action but does not detail failure modes or side effects. The polling behavior adds transparency, raising the score above baseline.
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 fairly concise, with a clear header sentence followed by conditions and parameter explanations. It could be slightly more streamlined by integrating the 'Call after' condition more tightly, but overall it is well-structured and front-loaded with essential information.
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?
Given no annotations, the description covers the basic behavior, preconditions, and parameter sources. It mentions automatic polling, which is a key behavioral detail. The presence of an output schema (not shown but indicated) supplements the completeness. Could mention error handling or what to do if the challenge is already confirmed, but the description is largely adequate.
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%, but the description provides detailed explanations for both parameters in the Args section: site_url comes from agents.json, challenge_id from the 402 response. This adds significant meaning beyond the raw schema, which only lists names and types.
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 clearly states the tool confirms a high-risk action or completes a payment challenge, specifying the context: after wais_execute returns a 402 confirmation challenge and user approval. The verb 'confirm' is specific and distinguishes it from sibling tools like wais_execute (preceding step) and wais_discover/wais_register/wais_status (different purposes).
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?
Explicitly states when to call: after wais_execute returns a 402 confirmation challenge and the user has approved. Also mentions that if there was a payment link, payment must be completed first, and describes automatic polling if a resolution object exists. This provides clear context and conditions for use.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wais_discoverA
Discover what a WAIS-compatible site offers. Call this first for any site.
Fetches /.well-known/agents.json and returns a summary showing:
site.url and site.api_base_url (how the site identifies itself)
Available actions with their IDs, endpoints, methods, and parameters
Registration requirements, constraints, and payment info
The agents.json is the source of truth. Use the action IDs and parameter schemas it defines when calling wais_execute.
Args: site_url: The site's URL (e.g. "https://serphub.deeger.io").
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description fully informs the agent that it fetches /.well-known/agents.json and returns a summary including site URLs, actions, parameters, and registration info. It discloses that the agents.json is the source of truth, though it does not cover potential failure cases or 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?
The description is concise and well-structured: it starts with the purpose and usage, then briefly describes the fetch action and returned fields, and ends with the parameter description. Every sentence adds value without 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?
Given the tool's simplicity with one parameter and an output schema, the description is fully complete. It explains what the tool does, what it returns, and how to use the results with sibling tools, leaving no 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?
The input schema has 0% description coverage, so the description compensates by explaining the site_url parameter: 'The site's URL (e.g. 'https://serphub.deeger.io').' This adds essential meaning beyond the schema alone.
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 clearly states the tool's purpose: 'Discover what a WAIS-compatible site offers. Call this first for any site.' It uses a specific verb (discover) and resource (WAIS site capabilities), and distinguishes itself from sibling tools like wais_execute by directing the agent to use this tool first.
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 explicitly says 'Call this first for any site' and explains that the agents.json is the source of truth for action IDs used in wais_execute. While it does not mention when not to use it, the context implies this is the initial step, providing clear usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wais_executeA
Execute an action at a WAIS-compatible site.
Uses the agents.json from wais_discover to resolve the action's endpoint, HTTP method, and required scopes. If the site has an api_base_url, requests are routed there automatically. Tokens and DPoP proofs are handled internally.
Pass site.url (from agents.json) as site_url, the action id, and params matching the action's input_schema.
Examples: wais_execute("https://serphub.deeger.io", "search", {"query": "python"}) wais_execute("https://serphub.deeger.io", "get_usage") wais_execute("https://serphub.deeger.io", "list_jobs", {"limit": 5})
Args: site_url: The site.url from agents.json (shown in discover output). action_id: The action id from agents.json (e.g. "search", "get_usage"). params: Parameters matching the action's input_schema.
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | Yes | ||
| action_id | Yes | ||
| params | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries full burden. It discloses that tokens and DPoP proofs are handled internally and that requests route based on api_base_url, but does not mention side effects, error handling, or rate limits, leaving gaps in behavioral transparency.
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 well-structured with a clear purpose statement, mechanism explanation, parameter mapping, and examples. It is concise, with no wasted words, and front-loaded for quick understanding.
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?
Given that an output schema exists, the description need not explain return values. It covers dependencies, parameter semantics, and provides examples. However, without annotations, it could elaborate on edge cases or error behavior, but overall it is fairly complete.
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 0%, so description must compensate. It explains each parameter: site_url is from site.url in agents.json, action_id is the action id, params should match input_schema. Examples clarify usage, adding significant meaning beyond the schema.
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 'Execute an action at a WAIS-compatible site,' clearly identifying the verb (execute) and resource (action at a WAIS site). It differentiates from sibling tools by explaining it uses agents.json from wais_discover to resolve endpoints, methods, and scopes.
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 explains prerequisites (agents.json from wais_discover) and parameter mapping, providing context for when to use the tool. However, it does not explicitly state when not to use it or name alternatives, so there is room for improvement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wais_registerA
Register the user at a WAIS-compatible site using their WAIS identity.
Uses SD-JWT selective disclosure — only shares the claims listed in agents.json data_requirements.registration.required_claims.
Call wais_discover first to see what claims the site needs.
Args: site_url: The site.url from agents.json. claims: Claims to disclose (e.g. ["email"]). If not provided, uses required_claims from agents.json automatically.
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | Yes | ||
| claims | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden. It discloses the use of SD-JWT selective disclosure, the sharing of only required claims, and the optional claims parameter behavior. It lacks details on error scenarios or potential side effects, but the behavioral traits are sufficiently transparent for a registration 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?
The description is concise, at roughly 8 lines, with a clear structure: introduction, behavioral note, prerequisite, and parameter explanations. Every sentence adds value without 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?
Given the tool's simplicity (2 parameters, no enums, no nested objects) and the presence of an output schema, the description covers all necessary aspects: purpose, usage order (wais_discover first), parameter semantics, and default behavior. It is complete for the intended use.
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 0%, so the description must compensate. It explains site_url as 'The site.url from agents.json' and claims as 'Claims to disclose (e.g. ["email"]). If not provided, uses required_claims from agents.json automatically.' This adds meaningful context beyond the bare schema titles.
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 clearly states 'Register the user at a WAIS-compatible site using their WAIS identity' with specific verb and resource. It distinguishes from sibling tools like wais_discover by explaining the registration action and the use of SD-JWT selective disclosure.
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 explicitly advises 'Call wais_discover first to see what claims the site needs,' providing a clear prerequisite. It also explains the default behavior when claims are omitted, offering good context for when to use the tool versus relying on defaults.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
wais_statusA
Check the user's account status at a WAIS-compatible site.
Returns plan, credits, usage stats. The user must be registered first. Looks for a 'get_usage' or 'status' action in agents.json.
Args: site_url: The site.url from agents.json.
| Name | Required | Description | Default |
|---|---|---|---|
| site_url | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must suffice. It discloses that the tool is read-only (check status), details its return (plan, credits, usage stats), and reveals an internal behavior (looking for specific actions). It doesn't mention idempotency or rate limits, but the core behavior is well-covered.
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 extremely concise, with a clear first sentence stating the main action, followed by essential details in two more sentences. No redundant or ambiguous phrasing.
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?
Given the tool's simplicity (single parameter, no nested objects) and presence of an output schema, the description sufficiently covers prerequisites, behavior, and parameter guidance. It leaves no critical gaps for a standard status check.
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 input schema has only a title for site_url; the description adds full meaning by explaining it should be the site.url from agents.json, which completely compensates for the 0% schema coverage and clarifies the expected value.
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 clearly states the tool checks user account status at a WAIS-compatible site, returning specific data (plan, credits, usage stats). It distinguishes itself from sibling tools like wais_register (registration) and wais_execute (execution), making its purpose unambiguous.
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 includes a prerequisite ('user must be registered first') and explains the internal lookup in agents.json, providing practical context. While it doesn't explicitly list alternatives or when to avoid usage, the purpose is distinct enough from siblings to guide appropriate use.
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.2.3- First observed
wais_confirm - First observed
wais_discover - First observed
wais_execute - First observed
wais_register - First observed
wais_status
TDQS
Scored across 5 tools
Each tool has a unique, clearly defined purpose: discovery, execution, confirmation, registration, and status checking. No overlap or ambiguity between them.
All tools follow the consistent pattern 'wais_<verb>' with snake_case, such as wais_discover, wais_execute, wais_confirm, wais_register, and wais_status.
With 5 tools, the server is well-scoped for the WAIS protocol domain. It covers all essential operations without unnecessary extras or gaps.
The tool surface provides a complete workflow: discover site capabilities, register, execute actions, handle payment confirmations, and check status. No obvious missing functionality for the intended use case.
Maintenance
Related MCP Connectors
The Remote MCP server acts as a standardized bridge between LLM applications (like Claude, ChatGPT, and Cursor) and external services, enabling AI agents to access external tools and resources. Its primary capability is providing a centralized search tool to discover other MCP servers and their respective tools. Unlike local implementations, it runs remotely with OAuth authentication and permission controls for security.
MCP server for secureFlows: token-free URL builders and integration-linting tools for AI agents.
MCP Server for an Agent Task Marketplace
MCP server for progressive tool usage at any scale (see https://klavis.ai)
Related MCP Servers
- AlicenseAqualityFmaintenanceA universal MCP server that exposes all UTCP-registered tools to MCP clients while providing a web interface for tool management.710 npm204MIT
- FlicenseBqualityDmaintenanceMCP server enabling AI agents to participate in the Wisdom Network. Provides tools for knowledge management, trust relationships, and content transformation.41-
- FlicenseNot gradedqualityCmaintenanceAn MCP server that enables AI agents to execute real-world actions through 10 specialized engines covering authenticated API calls, browser automation, visual QA, shell commands, file operations, job scraping, and parallel task execution.-
- AlicenseNot gradedqualityCmaintenanceA universal MCP server for registering internal, external, and OpenAPI-based APIs as MCP tools. It exposes them to MCP clients via Streamable HTTP and provides admin portal, RBAC/session auth, credential injection, and audit logging.Academic Free v1.1