Skip to main content

Tools & Protocol

The developer view of the eCore MCP server: the JSON-RPC protocol, the full tool list with arguments and credit costs, and worked examples. To connect a client, see Connect.

Endpoint​

EnvironmentURL
Productionhttps://backend.ecoreservice.com/api/v1/mcp
Testhttps://test.ecoreservice.com/backend/api/v1/mcp

It's a single endpoint: POST carries JSON-RPC (initialize, tools/list, tools/call); GET opens the SSE stream. The connector handles this once you paste the URL.

Authentication​

OAuth 2.0 (Authorization Code + PKCE), auto-discovered from <server-url>/.well-known/oauth-authorization-server. On success the server issues your eCore API token, sent as Authorization: Bearer <token> on every tool call. Direct API callers may also use Authorization: Token <api_token> — the same scheme as the REST API.

Protocol​

Standard MCP JSON-RPC 2.0. List the available tools:

POST /api/v1/mcp
Authorization: Bearer <token>
Content-Type: application/json

{ "jsonrpc": "2.0", "id": 1, "method": "tools/list" }

Call a tool:

{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/call",
"params": {
"name": "search_contacts",
"arguments": { "industry": "Software", "job_level": "C Level", "limit": 10 }
}
}

Tools​

Ten tools. Legend: 🔵 read-only (free) · 🟠 consumes credits · 🟢 batch.

ToolTypeDescriptionArgumentsCost
search_contacts🔵Search DataCore for B2B contacts. Email & phone stay hidden until unlocked.industry, job_title, job_level, company_name, contact_office_country, employee_range, revenue_range, limit, offsetFree
search_companies🔵Search unique companies/accounts by industry, size, revenue, HQ location.industry, company_name, contact_office_country, employee_range, revenue_range, limit, offsetFree
unlock_contacts🟠 🟢Reveal email or phone for contacts you already have (by UUID).uuids (array, required), unlock_type: "email" | "phone" (required)1 / email · 5 / phone
enrich_email🟠Find a person's email from a LinkedIn URL, or name + company.linkedin_url, or first_name + last_name + company_name/company_website1 on success
enrich_phone🟠Find a person's phone from LinkedIn URL, email, or name + company.linkedin_url, email, or name + company5 on success
enrich_contact🟠Email and phone in a single lookup. Charges only for what's found and what your balance covers.linkedin_url, email, or name + company1 (email) + 5 (phone), only for fields returned
enrich_profile🟠Full enrichment — name, title, company, company website, location, work history, plus email + phone. Resolves the professional profile and looks up contact data.linkedin_url, or first_name + last_name + company_name (URL resolved automatically), optional email1 profile + 1 email (if found) + 5 phone (if found), balance permitting
check_wallet🔵Return your current eCore credit balance.—Free
validate_emails🟠 🟢Batch-validate a list of email addresses. Starts an async job and returns a job id.list of emailsVariable (per validated email)
check_email_validation_status🔵Poll a validate_emails job for status and results.job_idFree

The search_* and enrich_* tools mirror the Search, Unlock, Email/Phone Enrichment, and Email Validation REST endpoints. Filter values (industry, job_level, employee_range, revenue_range) follow the Filter Values reference.

Credits​

ActionCost
Search (contacts / companies)Free
Email (unlock or enrich)1 credit
Phone (unlock or enrich)5 credits
Profile enrichment (enrich_profile)1 credit
Full profile with email + phoneup to 7 credits
tip

You are only charged for data actually returned, and never beyond your balance — if your credits don't cover a phone, the phone simply isn't included (and isn't billed). See Credit Costs.

Examples​

Enrich a full profile by LinkedIn URL​

{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "enrich_profile",
"arguments": { "linkedin_url": "https://www.linkedin.com/in/janedoe/" }
}
}

Enrich by name + company (URL resolved automatically)​

{
"name": "enrich_profile",
"arguments": { "first_name": "Jane", "last_name": "Doe", "company_name": "Acme" }
}

Search, then unlock​

// 1) search_contacts -> returns contacts with UUIDs (email/phone hidden)
// 2) unlock_contacts:
{
"name": "unlock_contacts",
"arguments": { "uuids": ["<uuid1>", "<uuid2>"], "unlock_type": "email" }
}
note

For bulk / asynchronous enrichment over many records, use the one-flow Pipeline API (POST /api/v1/pipeline/) instead of calling the enrich tools one by one.