Skip to main content
Glama
jbeker

ChartHop Search MCP

README.md
# ChartHop Search MCP

A small [MCP](https://modelcontextprotocol.io) server that searches the 1Password/AgileBits
employee directory (ChartHop). It mirrors the ChartHop piece of the Internal1P Alfred workflow:
under the hood it calls `GET {host}/alfred/charthop?q={query}` with a bearer token and returns the
matching people.

## Tool

### `search_people(query)`

Search the directory by name (or partial name). Returns a list of people, each with:

| Field         | Meaning                              |
| ------------- | ------------------------------------ |
| `name`        | Full name                            |
| `job_title`   | Role / title                         |
| `profile_url` | Link to the person's ChartHop profile |

Returns an empty list when there are no matches.

## Configuration

Configuration is read from environment variables:

| Variable          | Required | Default                      | Notes                                                     |
| ----------------- | -------- | ---------------------------- | --------------------------------------------------------- |
| `CHARTHOP_TOKEN`  | yes      | —                            | Your Internal1P bearer token (JWT).                       |
| `CHARTHOP_HOST`   | no       | `https://www.internal1p.com` | Override for staging (`https://www.internal1pdev.com`) or local dev. |

> Supply **your own** token. Do not reuse a token belonging to another person — it is tied to their
> account.

## Setup

```sh
uv sync
```

## Register with an MCP client

Add this to your client's MCP config (e.g. Claude Desktop `claude_desktop_config.json`, or via
`claude mcp add` for Claude Code):

```json
{
  "mcpServers": {
    "charthop": {
      "command": "uv",
      "args": [
        "--directory", "/Users/jeremybeker/development/charthup_mcp",
        "run", "charthop-mcp"
      ],
      "env": {
        "CHARTHOP_TOKEN": "<your-jwt>"
      }
    }
  }
}
```

## Verify

Smoke-test the tool logic directly (no MCP client needed):

```sh
CHARTHOP_TOKEN=<your-jwt> uv run python -c \
  "from charthop_mcp.server import search_people; import json; print(json.dumps(search_people('jeremy'), indent=2))"
```

Or inspect it interactively with the MCP Inspector:

```sh
uv run mcp dev src/charthop_mcp/server.py
```

TDQS

A4.7/5.0

Scored across 1 tool

Disambiguation5/5

With only one tool, there is no possibility of confusion or overlap. The tool's purpose is clearly defined as searching for people by name.

Naming Consistency5/5

The tool name 'search_people' follows the standard verb_noun convention, is descriptive, and is internally consistent, even though it is the only tool.

Tool Count5/5

The server is explicitly a search MCP, so a single tool dedicated to searching people is well-scoped and earns its place. The narrow purpose does not require additional tools.

Completeness5/5

The tool fully covers the stated purpose of searching the employee directory by name and returns relevant fields. No obvious gaps exist for this narrow domain.

Maintenance

ActivityMaintained
ResponsivenessSyncing