Ocean.io MCP server for AI agents

Live

API KEY

ACCOUNT DISCOVERY

CRM & Sales

Ocean.io gives your agent account discovery from lookalike search: find companies and people similar to your best customers, enrich them by domain or LinkedIn handle, read LinkedIn post activity, and manage exclusion lists and segmentations.

  • Per-user credentials: each call uses the actual user's API key, never a shared bot.
  • Encrypted per-tenant vault: AES-256, resolved at request time, never in LLM context.
  • Scoped before every call: pre-call scope check, 90-day SIEM-exportable audit chain.
Ocean.io
agent · Acme Q3
Run
Find companies like northwind.io and contoso.com in Germany.
S
ocean_search_companies
131ms
Account discovery agent
Ocean.io found 214 lookalike companies in Germany. The first 25 are ready with domain, size, and industry.
Sources: Ocean.io, 2 seed domains
ocean
214 companies
18:29
Message Claude...

Tools your account discovery agent reaches for on Ocean.io, scoped per user.

CALL ANY TOOL
32 tools for account discovery in Ocean.io: search lookalike companies and people, enrich them in bulk, read LinkedIn posts, comments, and reactions, segment domains, and manage exclusion lists.
ocean_add_exclusion_list_items
Add exclusion list items
Add company domains or LinkedIn handles to an exclusion list, creating the list when no listId is given. Returns the listId of the updated or new list. Use this tool to keep known companies or people out of search results. Use ocean_create_exclusion_list to create an empty list.
Parameters
Name
Type
Required
Description
items
array
Required
Company domains or LinkedIn handles to add, up to 10,000 per request. Items are company domains in a companies list and LinkedIn handles in a people list. A URL is reduced to its domain or LinkedIn handle (`https://www.linkedin.com/in/john-doe/` is stored as `john-doe`).
type
string
Required
Whether the list holds people (LinkedIn handles) or companies (domains). One of: `people`, `companies`.
listId
string
Optional
List to add items to. A new list is created when omitted.
ocean_add_marked_domains
Add marked domains
ocean_attribute_segmentation_domains
Attribute segmentation domains
ocean_autocomplete_companies
Autocomplete companies
ocean_autocomplete_job_titles
Autocomplete job titles
ocean_autocomplete_keywords
Autocomplete keywords
ocean_autocomplete_locations
Autocomplete locations
ocean_create_exclusion_list
List create exclusion
ocean_create_segmentation
Create segmentation
ocean_delete_exclusion_list
List delete exclusion
ocean_enrich_company
Enrich company
ocean_enrich_person
Enrich person
ocean_get_company_posts
Get company posts
ocean_get_credit_balance
Get credit balance
ocean_get_data_fields
Get data fields
ocean_get_exclusion_list
List get exclusion
ocean_get_person_posts
Get person posts
ocean_get_post_comments
Get post comments
ocean_get_post_reactions
Get post reactions
ocean_get_post_reshares
Get post reshares
ocean_get_segmentation
Get segmentation
ocean_list_exclusion_lists
List exclusion lists
ocean_lookup_companies
Lookup companies
ocean_lookup_people
Lookup people
ocean_preview_search_companies
Preview search companies
ocean_preview_search_people
Preview search people
ocean_remove_exclusion_list_items
Remove exclusion list items
ocean_rename_exclusion_list
List rename exclusion
ocean_search_companies
Search companies
ocean_search_people
Search people

For more tools, view docs.

Build your Agent
Same auth pattern across LangChain, OpenAI, Anthropic, and Google ADK.
Python · LlamaIndex
import { ScalekitClient } from "@scalekit-sdk/node";
import { createReactAgent } from "@langchain/langgraph/prebuilt";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

// Ocean.io tools scoped to this user
const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ocean"], toolNames: [
    "ocean_search_companies",
    "ocean_search_people",
    "ocean_enrich_company"] },
  pageSize: 100,
});

const agent = createReactAgent({ llm, tools });
await agent.invoke({ messages: [{ role: "user", content: "Find companies like northwind.io in Germany and their heads of RevOps" }] });
import OpenAI from "openai";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const openai = new OpenAI();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ocean"] }, pageSize: 100,
});

const res = await openai.chat.completions.create({
  model: "gpt-5",
  messages: [{ role: "user", content: "Find companies like northwind.io in Germany and their heads of RevOps" }],
  tools,
});

// Execute the tool call with the user's vaulted Ocean.io API key
await sk.tools.executeTool(res.choices[0].message.tool_calls[0], "user_123");
import Anthropic from "@anthropic-ai/sdk";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);
const anthropic = new Anthropic();

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ocean"] }, pageSize: 100,
});

const msg = await anthropic.messages.create({
  model: "claude-sonnet-5",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Find companies like northwind.io in Germany and their heads of RevOps" }],
  tools,
});

// Tool call runs with the user's vaulted Ocean.io API key
await sk.tools.executeTool(msg.content, "user_123");
import { Agent } from "@google/adk/agents";
import { ScalekitClient } from "@scalekit-sdk/node";

const sk = new ScalekitClient(env.SCALEKIT_ENV_URL, env.SCALEKIT_CLIENT_ID, env.SCALEKIT_CLIENT_SECRET);

const { tools } = await sk.tools.listScopedTools("user_123", {
  filter: { connectionNames: ["ocean"] }, pageSize: 100,
});

const agent = new Agent({
  name: "account_discovery_agent",
  model: "gemini-2.5-pro",
  instruction: "Ocean.io tools scoped to this user",
  tools,
});

await agent.run("Find companies like northwind.io in Germany and their heads of RevOps");
Try these prompts
Copy any prompt into your agent. Each maps directly to a Ocean.io tool. Click to copy, paste into your agent, done.
Lookalike search
Copy the prompt
Copied
Find companies like northwind.io and contoso.com in Germany.
Copy the prompt
Copied
Preview how many heads of RevOps work at those companies.
Copy the prompt
Copied
Suggest valid job titles that start with Head of Rev.
Enrichment
Copy the prompt
Copied
Enrich these 200 domains with company size and industry.
Copy the prompt
Copied
Enrich the person behind this LinkedIn handle.
Copy the prompt
Copied
How many Ocean.io credits do I have left?
Signals and lists
Copy the prompt
Copied
Show the latest LinkedIn posts from Contoso's company page.
Copy the prompt
Copied
Add our current customers' domains to an exclusion list.
Copy the prompt
Copied
Segment these 500 domains and show which segment each one fits.
SEE HOW AUTH WORKS
Each user connects their own Ocean.io API key once, and Scalekit sends it with every call. Keys stay vaulted, every call is scope checked, and every action is logged.
1
Authorize
Your user connects
Ocean.io
once. We tie it to their identity and the meetings they approved — no shared bot account, no org-wide access
Who:
user ‘A’
when:
Once per user
access:
Limited to user
2
Store
Their
Ocean.io
token lives in a vault scoped to them. User A's meetings are never reachable by an agent acting for user B, even on the same connection
vault:
encrypted
scope:
per-user
tokens:
auto-refreshed
3
Resolve
When your agent calls a
Ocean.io
tool, we fetch the right token server-side. It never touches your agent, never appears in the LLM context, never shows up in your logs
speed:
~40ms
check:
before every call
seen by:
nobody
4
Audit
Every
Ocean.io
tool call is logged — who triggered it, which meeting was fetched, what came back. 90 days of history, tied to the user who authorized it
history:
90 days
export:
SIEM-ready
logged:
every call
Test other agents
See the same per-user auth pattern across other sales and marketing connectors.
GTM and RevOps Teams
Outbound prospecting agent
Searches Apollo for prospects matching your ICP, scores and ranks them, drafts personalized outreach in Gmail, and logs every send to Google Sheets. Mail goes out as the rep, not from a shared inbox.
GTM and RevOps Teams
Competitive intelligence briefing agent
Scans Gong calls for competitor mentions, matches each one to its Notion battlecard, and DMs every affected rep a single Slack digest per cycle. Every call runs as the PMM who owns the briefing, never a shared bot.
Test other agents
See the same per-user auth pattern across other sales and marketing connectors.
SALES
Outbound prospecting agent
Search Apollo for ICP matches, rank them, draft personalised Gmail outreach, and log every send to Google Sheets.
GTM
Competitive intelligence briefing agent
Scan Gong calls for competitor mentions, match each one to its Notion battlecard, and DM every affected rep a single Slack digest.
Why Scalekit
Secure your agent's access. Connectors ship in minutes
01.
Shared tokens break per-user analytics
A shared Ocean.io API key looks fine in a demo. In production every search and list change looks like one service account, and you cannot tell which user triggered it. Scalekit resolves the credential of the actual user who triggered the agent, never a shared bot.
// shared key
audit → bot_service_account

// scalekit
audit → user_abc ✓
02.
Authentication is not authorization
03.
Multi-tenancy is architectural
04.
Ocean.io today. Ten connectors tomorrow.
“Our agents act across Salesforce, Gong, Google Drive, and more, on behalf of every customer. Scalekit behind the scenes meant we can keep adding tools without ever rebuilding how credentials or tool calling work.”
Venu Madhav Kattagoni
Head of Engineering / Von
FAQs
Frequently Asked Questions
Does the agent access Ocean.io as the user or through a shared API key?
As the user. Each user connects their own Ocean.io API key once, and Scalekit sends it with every call. Audit logs attribute every search, enrichment, and list change to that user, not a shared service account.
Where is the Ocean.io API key stored?
In Scalekit's managed AES-256 token vault, namespaced per tenant. To rotate it, the user reconnects with a new API key. Revocation is a single dashboard action. Credentials never appear in prompts, logs, or LLM context.
Can I limit what the agent does in Ocean.io?
Yes. Filter by tool name in listScopedTools to expose only what you want, for example search and enrichment without ocean_delete_exclusion_list, which deletes a list and all of its items. Scalekit also enforces scope checks before every API call.
What happens when a user revokes Ocean.io access?
The connection is invalidated on the next tool call. Subsequent requests for that user fail closed with a clear error. Other users in the tenant remain unaffected. The event is logged for audit.
How can the agent size an Ocean.io search before running it?
It can call ocean_preview_search_companies or ocean_preview_search_people first, which return the total number of matches and a small sample, then run the full search. ocean_get_credit_balance shows the remaining credits.
Start in your coding agent
Up and running in one command
Install the Scalekit skill in your editor of choice. Connector, auth, tools, prompt, all wired up
Claude Code REPL
/plugin marketplace add scalekit-inc/claude-code-authstack
/plugin install agentkit@scalekit-auth-stack
Cursor Code REPL
# ~/.cursor/mcp.json
{
""mcpServers"": {
""ocean"": {
""url"": ""https://mcp.scalekit.com/ocean"",
""headers"": { ""Authorization"": ""Bearer $SCALEKIT_TOKEN"" }
}
}
}
Codex Code REPL
# ~/.codex/config.toml
[mcp_servers.ocean]
url = ""https://mcp.scalekit.com/ocean""
auth_env = ""SCALEKIT_TOKEN""
Copilot Code REPL
# .vscode/mcp.json
{
""servers"": {
""ocean"": {
""url"": ""https://mcp.scalekit.com/ocean"",
""type"": ""http""
}
}
}