> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://gtm-tools.sh/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://gtm-tools.sh/_mcp/server.

# Eve

> Add GTM Tools to a Vercel Eve agent as the official skill or an MCP connection, with approval gates on the LinkedIn and Reddit write tools.

## Getting started

[Eve](https://vercel.com/eve) is Vercel's agent framework: you write an `agent/` directory of instructions, typed tools, and skills, and Eve compiles it into a deployable agent with durable workflows and channels for Slack, Discord, Teams, WhatsApp, web, and plain APIs. By adding GTM Tools to Eve, your agent gains the go-to-market data surface: buying-signal detection on any domain, LinkedIn company and people lookup, SMTP-verified email finding, and Reddit reads and writes.

There are two ways to integrate GTM Tools with Eve: installing the official `gtm-tools` skill, or adding an MCP connection.

## Option 1: Official GTM Tools Skill (Recommended)

The easiest way to add GTM capabilities to Eve is by installing the official GTM Tools skill from [skills.sh](https://www.skills.sh/arnaudjnn/gtm-skills/gtm-tools). This skill is maintained by the GTM Tools team and provides the full go-to-market toolset.

### Installation

Install the skill into your Eve project:

```bash
npx skills add arnaudjnn/gtm-skills --skill gtm-tools --agent eve --yes
```

That writes `agent/skills/gtm-tools/`, which is where Eve scans for skills. Use `--subagent <name>` to install into a subagent instead, since skills are scoped to the agent that declares them.

### Configuration

The skill calls the API with a bearer token, so set your key in the environment Eve runs with. For local development that is `.env.local`:

```bash
GTM_TOOLS_API_KEY=sk_your_api_key
```

Add the same variable to your Vercel project environment for deploys, then `vercel env pull` to sync it locally. Get a key with `get_api_key` or `gtm-tools admin login`. See [Getting Your API Key](/knowledge-base/getting-started/getting-api-key).

### Features

The official skill includes:

* **Buying signals:** hiring, Trustpilot sentiment, follower spikes, and tech-stack detection on any domain
* **LinkedIn lookup:** company and profile resolution from a domain or a name, employee search with boolean title filters
* **LinkedIn writes:** DMs and connection requests from your own logged-in account
* **Reddit:** thread and subreddit reads, comments, posts, votes, and DMs through Reddit Chat
* **Email:** SMTP-verified professional email finding, with a reason on every unconfirmed lookup
* **Billing:** balance, top-ups, and auto-reload, so the agent can manage its own wallet
* **Cost discipline:** the full 63-tool catalog with credit costs, the metering rules, and the error contract

### Verify installation

Eve advertises each skill's description and loads the body only when a turn calls for it, through a framework-owned `load_skill` tool. Start the agent and ask for something the skill covers:

```bash
npx eve dev
```

Then send `what is my GTM Tools credit balance?`. The agent should load the skill and answer. `get_credit_balance` costs 0 credits, so the check is free.

## Option 2: MCP Connection

For typed tool schemas instead of shell calls, add an MCP connection. Eve then exposes our tools through `connection_search`, and its own tool filters and approval gates apply to them.

### Add the connection

Connections are one file each under `agent/connections/`. The filename becomes the connection name, and its tools surface as `<connection>__<tool>`:

**`agent/connections/gtm.ts`**

```ts title="agent/connections/gtm.ts"
import { defineMcpClientConnection } from "eve/connections";

export default defineMcpClientConnection({
  url: "https://api.gtm-tools.sh/mcp",
  description:
    "GTM data: buying signals on a domain, LinkedIn company and people lookup, " +
    "SMTP-verified professional emails, and Reddit threads. Use when the task " +
    "involves prospecting, enriching a contact, or checking whether a company " +
    "is worth reaching out to.",
  auth: {
    getToken: async () => ({ credit: process.env.GTM_TOOLS_API_KEY! }),
  },
});
```

Eve sends the returned credit as `Authorization: Bearer <credit>`, which is what our endpoint expects. Write the `description` for the model: it is the main signal `connection_search` uses when deciding which connection to query.

### Configure the connection

We expose 64 tools, so allowlist the ones this agent should discover with exactly one of `tools.allow` or `tools.block`:

**`agent/connections/gtm.ts`**

```ts title="agent/connections/gtm.ts"
export default defineMcpClientConnection({
  url: "https://api.gtm-tools.sh/mcp",
  description: "GTM data: buying signals, LinkedIn lookup, verified emails.",
  auth: { getToken: async () => ({ credit: process.env.GTM_TOOLS_API_KEY! }) },
  tools: {
    allow: [
      "detect_signal",
      "get_linkedin_company_url",
      "list_linkedin_company_employees",
      "get_email",
      "get_credit_balance",
    ],
  },
});
```

Five of our tools act as your own account, so gate them rather than allowing them silently. A blanket `always()` would prompt on every harmless lookup, so pass a policy that gates only the sends:

**`agent/connections/gtm.ts`**

```ts title="agent/connections/gtm.ts"
const SENDS = [
  "send_linkedin_message",
  "send_linkedin_invitation",
  "create_reddit_comment",
  "create_reddit_post",
  "send_reddit_message",
];

export default defineMcpClientConnection({
  url: "https://api.gtm-tools.sh/mcp",
  description: "GTM data and outreach: signals, LinkedIn, Reddit, verified emails.",
  auth: { getToken: async () => ({ credit: process.env.GTM_TOOLS_API_KEY! }) },
  approval: ({ toolName }) =>
    SENDS.some((name) => toolName.endsWith(name)) ? "user-approval" : "not-applicable",
});
```

Return `"user-approval"` to pause for a person and `"not-applicable"` to run without a prompt. A policy can also decide on its own with `"approved"` or `"denied"`, and `once()`, `always()`, and `never()` from `eve/tools/approval` cover the blanket cases. Match on `endsWith`, since the policy sees the namespaced tool name.

### Verify the connection

Run the agent locally and ask for something only the connection can answer:

```bash
npx eve dev
```

`what is my GTM Tools credit balance?` is the cheapest check: `get_credit_balance` costs 0 credits, so a successful answer proves auth and transport in one call.

## Example use cases

Once GTM Tools is integrated with Eve, you can ask your agent to:

* "Which of these domains are hiring SDRs right now?"
* "Find the Head of CX at gymshark.com and verify their email"
* "Draft a LinkedIn DM to that person referencing the signal that fired"
* "Check r/sales for threads about our category this week"
* "How many credits are left on the workspace?"