Developers
MCP Server, REST API, and everything you need to build on OnlyData Club.
MCP Server
Manage professional identities from Claude Code, Claude Desktop, Cursor, or any MCP-compatible AI agent.
# Install and run npx @onlydata/mcp-server # With API key for write access ONLYDATA_API_KEY=od_xxx npx @onlydata/mcp-server
Claude Code config
{
"mcpServers": {
"onlydata": {
"command": "npx",
"args": ["@onlydata/mcp-server"],
"env": {
"ONLYDATA_API_KEY": "od_your_key_here"
}
}
}
}
MCP Tools
| Tool | Access | Description |
|---|---|---|
get_profile | Public | Get a profile by slug |
list_profiles | Public | List all public profiles |
search_profiles | Public | Search by name, headline, location |
get_verification | Public | Full attribute provenance |
create_profile | Auth | Create a person or company profile |
update_profile | Auth | Update profile fields |
set_signals | Auth | Set open-to signals (recruiting, advisory, etc.) |
set_coop_sharing | Auth | Enable/disable cooperative sharing |
send_message | Auth | Message another member |
get_inbox | Auth | Read your messages |
get_sent_messages | Auth | View sent messages |
verify_domain | Auth | Verify company domain ownership (DNS, file, or meta tag) |
get_agent_readiness | Public | Agent readiness scores (crawlability, API, MCP signals) |
No tools match your search.
Access levels
No account needed
Search and read all public profiles, verification data, and metadata. Anyone — human or agent — can query OnlyData without authentication.
- Browse and search all public profiles
- Read full profile data (name, headline, about, roles, skills, projects)
- Get verification and provenance JSON for any profile
- Access OpenAPI spec, llms.txt, MCP manifest, sitemap
With account (API key)
Create an account at /join, then generate an API key in your profile settings. With a key you can:
- Create and update your own profile
- Set availability signals (open to recruiting, advisory, partnerships)
- Send and receive messages from other members
- Enable cooperative sharing (opt your profile into partner networks)
- Configure what's shareable (email, phone, signals are all user-controlled)
REST API
Full OpenAPI 3.0 spec at /openapi.json. Key endpoints:
| Method | Endpoint | Access |
|---|---|---|
| GET | /api/profiles | Public |
| GET | /api/profile/:slug | Public |
| GET | /api/profile/:slug/verification | Public |
| GET | /api/coop/profiles | Public |
| POST | /api/claim | Auth |
| PATCH | /api/profile/:slug | Auth |
| POST | /api/profile/:slug/signals | Auth |
| POST | /api/messages/send | Auth |
| GET | /api/messages/inbox | Auth |
| GET | /api/verify-domain/instructions/:slug | Public |
| POST | /api/verify-domain/:slug | Auth |
| GET | /api/agent-readiness | Public |
| GET | /api/agent-readiness/:slug | Public |
# List all profiles curl https://onlydata.club/api/profiles # Get a profile by slug curl https://onlydata.club/api/profile/jane-doe # Authenticated request curl -H "x-api-key: od_your_key" \ https://onlydata.club/api/me
// List all profiles const res = await fetch('https://onlydata.club/api/profiles'); const { profiles } = await res.json(); // Authenticated request const res = await fetch('https://onlydata.club/api/me', { headers: { 'x-api-key': 'od_your_key' } });
import requests # List all profiles res = requests.get('https://onlydata.club/api/profiles') profiles = res.json()['profiles'] # Authenticated request res = requests.get( 'https://onlydata.club/api/me', headers={'x-api-key': 'od_your_key'} )
Authentication
Two methods — API key is recommended for MCP integrations and scripts. Supabase JWTs are used for browser sessions.
# API key (recommended) curl -H "x-api-key: od_your_key" \ https://onlydata.club/api/me # Supabase JWT (browser sessions) curl -H "Authorization: Bearer eyJ..." \ https://onlydata.club/api/me
// API key const res = await fetch('https://onlydata.club/api/me', { headers: { 'x-api-key': 'od_your_key' } }); // Supabase JWT const res = await fetch('https://onlydata.club/api/me', { headers: { 'Authorization': `Bearer ${token}` } });
import requests # API key res = requests.get( 'https://onlydata.club/api/me', headers={'x-api-key': 'od_your_key'} ) # Supabase JWT res = requests.get( 'https://onlydata.club/api/me', headers={'Authorization': f'Bearer {token}'} )
Domain Verification
Prove ownership of a company domain to get a verified badge. Three methods available — pick whichever fits your setup. Verified companies also auto-elevate team members whose email domains match.
Step 1: Get instructions
curl https://onlydata.club/api/verify-domain/instructions/your-company
Step 2: Choose a method
| Method | What to do | Best for |
|---|---|---|
dns |
Add TXT record: onlydata-verify=your-slug |
Recommended — strongest proof, works for any domain |
file |
Host /.well-known/onlydata-verify.txt with your slug |
Easy if you control the web server |
meta |
Add <meta name="onlydata-verify" content="your-slug"> to homepage |
Quick — just a one-line HTML change |
Step 3: Trigger verification
# DNS verification curl -X POST https://onlydata.club/api/verify-domain/your-company \ -H "x-api-key: od_your_key" \ -H "Content-Type: application/json" \ -d '{"method": "dns"}' # File verification curl -X POST https://onlydata.club/api/verify-domain/your-company \ -H "x-api-key: od_your_key" \ -H "Content-Type: application/json" \ -d '{"method": "file"}' # Meta tag verification curl -X POST https://onlydata.club/api/verify-domain/your-company \ -H "x-api-key: od_your_key" \ -H "Content-Type: application/json" \ -d '{"method": "meta"}'
const res = await fetch('https://onlydata.club/api/verify-domain/your-company', { method: 'POST', headers: { 'x-api-key': 'od_your_key', 'Content-Type': 'application/json' }, body: JSON.stringify({ method: 'dns' }) });
import requests res = requests.post( 'https://onlydata.club/api/verify-domain/your-company', headers={'x-api-key': 'od_your_key'}, json={'method': 'dns'} )
On success
- Profile gets verified status with green badge
- Verification proof stored in
profile_data.domain_verification - Team members with matching email domains are auto-elevated to verified
Admin override
Admins can verify any profile directly — no DNS/file check needed:
curl -X POST https://onlydata.club/api/admin/verify/your-company \ -H "x-admin-key: YOUR_ADMIN_KEY" \ -H "Content-Type: application/json" \ -d '{"status": "verified", "domain": "yourcompany.com"}'
MCP tool
Agents can verify domains through the MCP server:
// Get instructions (omit method) { "tool": "verify_domain", "args": { "slug": "your-company" } } // Attempt DNS verification { "tool": "verify_domain", "args": { "slug": "your-company", "method": "dns" } }
Agent Readiness Scores
Every OnlyData profile with a website is scanned for agent-readiness signals. Scores range 0–100 across six categories:
| Category | What it measures |
|---|---|
| Crawlability | robots.txt, sitemap.xml |
| Machine Readability | JSON-LD, schema.org, meta tags |
| API Readiness | OpenAPI spec, API docs links |
| Agentic Commerce | ai-plugin.json, MCP manifest, llms.txt |
| Content Access | RSS/Atom feeds, clean HTML |
| Agent Signals | Explicit MCP, LLM, and agent support |
# All scores (ranked) curl https://onlydata.club/api/agent-readiness # Single profile curl https://onlydata.club/api/agent-readiness/producthacker
// All scores { "tool": "get_agent_readiness" } // Single profile { "tool": "get_agent_readiness", "args": { "slug": "producthacker" } }
Scans run on a periodic schedule. Scores include an AI-generated summary and full check details per profile.
Agent-readable files
| File | Purpose |
|---|---|
/llms.txt | LLM-readable site description |
/openapi.json | OpenAPI 3.0 specification |
/mcp.json | MCP tool manifest |
/.well-known/ai-plugin.json | AI plugin manifest |
/sitemap.xml | Dynamic sitemap |
/robots.txt | Crawler rules (AI bots welcome) |
# Fetch LLM description curl https://onlydata.club/llms.txt # Fetch OpenAPI spec curl https://onlydata.club/openapi.json # Fetch MCP manifest curl https://onlydata.club/mcp.json