Integration · MODEL CONTEXT PROTOCOL
hdw-mcp-server
A Model Context Protocol (MCP) server that provides comprehensive access to LinkedIn data and functionalities using the HorizonDataWave API, enabling not only data retrieval but also robust management of user accounts.
WHAT IT CONNECTS
What hdw-mcp-server gives an AI Agent
- **LinkedIn Users Search:** Filter and search for LinkedIn users by keywords, name, title, company, location, industry, and education.
- **Profile Lookup:** Retrieve detailed profile information for a LinkedIn user.
- **Email Lookup:** Find LinkedIn user details by email address.
- **Posts & Reactions:** Retrieve a user's posts and associated reactions.
- **Post Reposts & Comments:** Retrieve reposts and comments for a specific LinkedIn post.
- **Account Management:**
- **Chat Functionality:** Retrieve and send chat messages via the LinkedIn management API.
- **Connection Management:** Send connection invitations to LinkedIn users.
- **Post Commenting:** Create comments on LinkedIn posts or replies.
- **User Connections:** Retrieve a list of a user's LinkedIn connections.
- **Company Search & Details:**
- **Google Company Search:** Find LinkedIn companies using Google search – the first result is typically the best match.
- **Company Lookup:** Retrieve detailed information about a LinkedIn company.
- **Company Employees:** Retrieve employees for a given LinkedIn company.
- **Google Search**
- **Search LinkedIn Users**
- `keywords` (optional): Any keyword for search.
- `first_name`, `last_name`, `title`, `company_keywords`, `school_keywords` (optional).
- `current_company`, `past_company`, `location`, `industry`, `education` (optional).
- `count` (optional, default: 10): Maximum number of results (max 1000).
- `timeout` (optional, default: 300): Timeout in seconds (20–1500).
- **Get LinkedIn Profile**
- `user` (required): User alias, URL, or URN.
- `with_experience`, `with_education`, `with_skills` (optional, default: true).
- **Get LinkedIn Email User**
- `email` (required): Email address.
- `count` (optional, default: 5).
- `timeout` (optional, default: 300).
- **Get LinkedIn User Posts**
- `urn` (required): User URN (must include prefix, e.g. `fsd_profile:...`).
- `count` (optional, default: 10).
- `timeout` (optional, default: 300).
- **Get LinkedIn User Reactions**
- `urn` (required).
- `count` (optional, default: 10).
- `timeout` (optional, default: 300).
- **Get LinkedIn Chat Messages**
- `user` (required): User URN (with prefix).
- `count` (optional, default: 20).
- `timeout` (optional, default: 300).
- **Send LinkedIn Chat Message**
- `user` (required): Recipient user URN (with prefix).
- `text` (required): Message text.
- `timeout` (optional, default: 300).
- **Send LinkedIn Connection Request**
- `user` (required).
- `timeout` (optional, default: 300).
- **Send LinkedIn Post Comment**
- `text` (required): Comment text.
- `urn` (required): Activity or comment URN.
- `timeout` (optional, default: 300).
- **Get LinkedIn User Connections**
- `connected_after` (optional): Timestamp filter.
- `count` (optional, default: 20).
- `timeout` (optional, default: 300).
- **Get LinkedIn Post Reposts**
- `urn` (required): Post URN (must start with `activity:`).
- `count` (optional, default: 10).
- `timeout` (optional, default: 300).
- **Get LinkedIn Post Comments**
- `urn` (required).
- `sort` (optional, default: `"relevance"`; allowed values: `"relevance"`, `"recent"`).
- `count` (optional, default: 10).
- `timeout` (optional, default: 300).
- **Get LinkedIn Google Company**
- `keywords` (required): Array of company keywords.
- `with_urn` (optional, default: false).
- `count_per_keyword` (optional, default: 1; range 1–10).
- `timeout` (optional, default: 300).
- **Get LinkedIn Company**
- `company` (required): Company alias, URL, or URN.
- `timeout` (optional, default: 300).
- **Get LinkedIn Company Employees**
- `companies` (required): Array of company URNs.
- `keywords`, `first_name`, `last_name` (optional).
- `count` (optional, default: 10).
- `timeout` (optional, default: 300).
- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`
- **Windows:** `%APPDATA%\Claude\claude_desktop_config.json`
SECURITY
An MCP listing is not a security review
An MCP server may receive model context, credentials, local files, or permission to call external systems. Review its code, requested environment variables, network behavior, package provenance, and maintenance status before connecting it to an agent.
README
Repository documentation
The entire web is your database. Your AI assistant is the query interface.
A Model Context Protocol server that lets Claude, Cursor, ChatGPT, and any MCP client query structured data from LinkedIn, Instagram, Twitter/X, Reddit, YouTube, SEC EDGAR, Y Combinator, Crunchbase, and any URL on the web — through five universal tools, plus CRM write-back tools.
Connect directly to the hosted server at https://mcp.anysite.io/mcp. It speaks MCP over Streamable HTTP with OAuth 2.0, and works with Claude Desktop, Claude Code, Cursor, Cline, Windsurf, ChatGPT, and any MCP-compliant client.
If your client supports HTTP transport, you do not need this npm package. The package exists as a stdio bridge for clients that only speak stdio.
Create an account at anysite.io. The MCP30 promo covers your first month of MCP Unlimited ($30/month, 6 req/min fair-use, no credit counting). Credit-based plans (Starter $49 / Growth $200 / Scale $300 / Pro $549 / Enterprise from $1,199) also include MCP access; see docs.anysite.io/mcp-server/overview.
Claude Desktop — OAuth
- Settings → Connectors → Add Custom Connector
- URL:
https://mcp.anysite.io/mcp - Click Connect, authorize in the browser
- Required: Settings → Capabilities → Tool access → Tools already loaded
The last step is critical. Claude Desktop's "Load tools when needed" mode uses name-based matching that fails on generic names like discover and execute. If you skip it, the tools exist but the model will not reliably call them.
Claude Code
claude mcp add --transport http anysite "https://mcp.anysite.io/mcp?api_key=YOUR_KEY"
claude mcp list # should show: anysite connectedThe URL carries your API key — treat it as a secret.
Cursor
Edit ~/.cursor/mcp.json (global) or .cursor/mcp.json in the project root:
{
"mcpServers": {
"anysite": {
"url": "https://mcp.anysite.io/mcp?api_key=YOUR_KEY",
"transport": "http"
}
}
}Cline, Windsurf, ChatGPT, any MCP client
Point any compliant client at https://mcp.anysite.io/mcp and authenticate via OAuth or ?api_key=YOUR_KEY.
Ask the assistant:
What MCP tools do you have from anysite?
It should list: discover, execute, get_page, query_cache, export_data — plus eight crm_* tools if the CRM integration is enabled on your account.
Use anysite to find 20 CTOs at Series B fintech startups in New York,
then show me the ones with AI or ML in their headline.
The assistant runs discover on LinkedIn, picks the right search endpoint, calls execute, then narrows server-side with query_cache.
@anysiteio/mcp is a thin local proxy: it runs on stdio and forwards every request to https://mcp.anysite.io/mcp over Streamable HTTP with your token. No business logic lives in the package — tools, instructions, caching and exports all come from the server, so new endpoints and tools appear without a package update.
Use it when your client cannot speak HTTP transport: stdio-only IDE plugins, older Cline/Continue builds, custom stdio runners, or environments where outbound HTTP must go through a managed local process.
npm install -g @anysiteio/mcpOr run on demand with npx -y @anysiteio/mcp.
{
"mcpServers": {
"anysite": {
"command": "npx",
"args": ["-y", "@anysiteio/mcp"],
"env": {
"ANYSITE_ACCESS_TOKEN": "your_token_here"
}
}
}
}That is the entire configuration. Only ANYSITE_ACCESS_TOKEN is required — create one at app.anysite.io. The token can also live in ~/.anysite-mcp.env.
| Tool | Purpose |
|---|---|
discover(source, category) |
List endpoints in a category with their params and LLM hints. Always call before execute. |
execute(source, category, endpoint, params) |
Fetch data. Returns first 10 items + cache_key. |
get_page(cache_key, offset, limit) |
Paginate cached items without re-fetching (limit ≤ 50). |
query_cache(cache_key, conditions?, sort_by?, aggregate?, group_by?) |
Filter / sort / aggregate cached items server-side. |
export_data(cache_key, output_format, list_unpack?) |
Dump the full dataset to json / jsonl / csv. Returns a download URL. |
crm_* (8 tools) |
HubSpot-and-friends read/write: connections, schema, upsert contacts/companies, query, undo. Visible only when CRM is enabled for your account. |
Sources surfaced through discover: LinkedIn, Instagram, Twitter/X, Reddit, YouTube, SEC EDGAR, Y Combinator, Crunchbase, DuckDuckGo, the universal web parser, plus AI parsers for GitHub, Amazon, Google Maps, G2, BuiltWith, Apify, GLEIF, Newegg and more. New endpoints appear automatically as soon as they ship on the platform.
Data fetched by execute is cached server-side for 7 days: one execute() call, then unlimited get_page / query_cache / export_data calls without re-paying API credits. Export files live for 24 hours (regenerated on demand while the cache entry is alive).
discover("linkedin", "search")
→ endpoints: ["users", "companies", "posts", ...] with params
execute("linkedin", "search", "users", { keywords: "CTO AI" })
→ { items: [...first 10], total: 50, cache_key: "abc..." , next_offset: 10 }
get_page("abc...", offset=10) # next page, free
query_cache("abc...", { conditions: [{ field: "location", op: "contains", value: "San Francisco" }] })
export_data("abc...", "csv") # full dataset as a CSV download URL
The agent figures out the parameter names on its own from discover.
v3 is a breaking change: the package no longer reimplements the server locally — it proxies the hosted MCP server. What changes for you:
export_datareturns a download URL (https://mcp.anysite.io/exports/…) instead of a local file path. Thefile_pathfield is gone; agents that read the exported file from disk must download it instead. The URL is accessible without a token (the file name is unguessable) and lives for 24 hours — do not share the link if the data is sensitive.export_dataparameter isoutput_format. The oldformatname is transparently rewritten by the bridge for backward compatibility, but new prompts should useoutput_format.get_pagecapslimitat 50 (server-side page size limit).- Cache is server-side now (7-day TTL, survives restarts, shared across your sessions) instead of in-process.
- CRM tools appear (8
crm_*tools) when the CRM integration is enabled on your account. - Env vars
ANYSITE_API_URLandANYSITE_OPENAPI_URLare removed — the bridge talks to the MCP server, not the raw API. UseANYSITE_MCP_URLto point at a different MCP server. binaliasesanysiteandmcpare removed — the command isanysite-mcp.- Two LinkedIn endpoints that were reachable in 2.x (
sn_search/users,company/employees) are excluded by server policy. - Tool results no longer carry a
mimeTypeon content items — the server defines the response shape. - Cancelling a long
tools/callstops the client-side wait, but the server keeps processing the request (stateless transport cannot deliver the cancellation) — the work is still billed.
The MCP server gives raw access. Anysite Skills package that access into named workflows you summon by topic, so the assistant runs a proven pattern instead of improvising. Built for Claude Code (also works in Cursor / Windsurf via the same plugin format).
| Workflow | What you say | What it does |
|---|---|---|
| Lead generation | "Find me 50 marketing directors at Series A SaaS in Berlin and enrich with email" | LinkedIn search → enrichment → CSV |
| Competitor intelligence | "Track @competitor across LinkedIn hires, social, YC, and recent posts" | Multi-source intel + hiring velocity + sentiment |
| Person analyzer | "Deep-dive on this LinkedIn profile before our partnership call" | LinkedIn + Twitter + Reddit + GitHub + web → strategic brief |
| Market research | "Map the AI legal-tech landscape — startups, funding, momentum" | YC + Crunchbase + SEC + Reddit + Twitter sentiment |
| Customer pain mining | "Pull verbatim complaints about Salesforce from Reddit and Twitter" | Pain clusters + exact quotes + white-space gaps |
| Brand reputation | "What is the conversation around our brand this week?" | Cross-platform mention scan with sentiment scoring |
| Positioning map | "Plot 3-5 competitors on a positioning map, find the empty quadrant" | Five-axis comparison + positioning statement |
Full catalog (17 skills, including VC analyst, influencer discovery, audience analysis, content analytics, trend analysis): github.com/anysiteio/agent-skills.
In Claude Code:
/plugin marketplace add https://github.com/anysiteio/agent-skills
/plugin install anysite-lead-generation@anysite-skillsYou can install one skill or the whole marketplace. The MCP server connection above is the only prerequisite.
git clone https://github.com/anysiteio/anysite-mcp.git
cd anysite-mcp
npm install
npm run build:tsc
ANYSITE_ACCESS_TOKEN=... node build/server.jsInspect the tools interactively:
npm run inspector| Env var | Required | Default | Notes |
|---|---|---|---|
ANYSITE_ACCESS_TOKEN |
yes | — | Create one at app.anysite.io |
ANYSITE_MCP_URL |
no | https://mcp.anysite.io/mcp |
Override the remote MCP server URL |
Variables can also live in ./.env or ~/.anysite-mcp.env (real environment variables and ./.env take precedence over ~/.anysite-mcp.env).
If the remote server is unreachable at startup, the bridge still starts in a degraded mode (empty tool list, descriptive errors on calls), keeps reconnecting in the background, and announces the tool list via tools/list_changed once the server is reachable again.
src/
├── server.ts stdio entry (CLI bin): env handling, connect with retries, degraded mode
├── proxy.ts the bridge: remote client, generic request forwarding, tools/list cache,
│ format→output_format shim, error mapping, background list refresh
├── index.ts Smithery TypeScript runtime adapter
└── config.ts env-derived constants
COMMUNITY