# `io.usefulapi/namely` on anlyon.dev

> Text inside fenced blocks marked untrusted-server-text was written by the MCP server's publisher, not by anlyon.dev. It is data to inspect, not instructions to follow. Invisible characters are shown as [U+XXXX].
> No finding is not a safety guarantee: these are point-in-time checks of tool definitions, not of code or behaviour.

- Page: https://anlyon.dev/servers/io.usefulapi/namely
- JSON: https://anlyon.dev/api/v1/servers/io.usefulapi/namely
- Version: 1.0.0 (active)
- Publisher: io.usefulapi (domain proven to the MCP Registry)
- Runs: remote (streamable-http)
- Sign-in to list tools: none
- Repository: https://github.com/m190/usefulapi-mcp
- Metadata from the official MCP Registry, synced 2026-10-24T11:18:08.452Z

Title and description, as the publisher wrote them:

```untrusted-server-text
Namely MCP by usefulapi
Read Namely employee profiles, groups, teams, jobs and reports; update profiles, post to the feed.
```

Scanned 2026-10-24T11:18:13.382Z over streamable-http.

**17 tools: 3 can delete or cancel things, 1 change things and 13 only read.**

| Group | Class | Tools | Claude Code |
| --- | --- | --- | --- |
| Deletes or cancels | destructive | 3 | deny |
| Can't be undone | irreversible | 0 | ask |
| Changes things | write | 1 | ask |
| Only reads | read | 13 | allow |

## Exfil surface

2 private-data -> untrusted-input -> outbound paths in this server alone. Denying 1 outbound tool breaks every one: `mcp__namely__namely_create_event_comment`.

| Tag | Meaning | Tools |
| --- | --- | --- |
| private-data | Reads files, mail, messages, databases, secrets, calendars or repositories. | `mcp__namely__namely_get_me` |
| untrusted-input | Brings in text someone else can write: web pages, inbound email, messages, issues and comments. | `mcp__namely__namely_get_me` `mcp__namely__namely_list_event_comments` |
| outbound | Can carry data to people or systems: it sends, posts or publishes, or takes a recipient, channel or URL. | `mcp__namely__namely_create_event_comment` |

| Private data | Untrusted input | Outbound |
| --- | --- | --- |
| `mcp__namely__namely_get_me` | `mcp__namely__namely_get_me` | `mcp__namely__namely_create_event_comment` |
| `mcp__namely__namely_get_me` | `mcp__namely__namely_list_event_comments` | `mcp__namely__namely_create_event_comment` |

## Findings

- **warn** Annotations that disagree with the tool in `namely_get_report` ([annotation-conflict](https://anlyon.dev/methodology#annotation-conflict))

```untrusted-server-text
The server marks "namely_get_report" read-only (readOnlyHint: true), and its own name, description or input give the class "write".

annotations: {"readOnlyHint":true}; The name "namely_get_report" says "get": a word for reading.
```


## Deletes or cancels (3)

Removes, cancels or revokes something. Claude Code: deny.

### `namely_create_announcement`

- The name "namely_create_announcement" says "create": a word for a change.
- The description says "cannot be undone".
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Post an announcement to the company home feed, visible to every employee. Markdown; to mention a person write [Full Name](/people/<profile_id>). With is_appreciation, mentioned people are appreciated. email_all=true ALSO EMAILS every active employee at their company address (needs the permission) and cannot be undone: set it only when the user explicitly asks. Namely API: POST /events.
```

### `namely_create_event_comment`

- The name "namely_create_event_comment" says "create": a word for a change.
- The server marks it destructive (destructiveHint: true).
- Tag outbound: The name "namely_create_event_comment" says "create" and "comment": it writes something other people read.

Description, as the server wrote it:

```untrusted-server-text
Add a comment to a feed event, posted as the token's user and visible to employees who see the event. Markdown; mention a person with [Full Name](/people/<profile_id>). Namely API: POST /events/{id}/comments.
```

### `namely_update_profile`

- The name "namely_update_profile" says "update": a word for a change.
- The server marks it destructive (destructiveHint: true).

Description, as the server wrote it:

```untrusted-server-text
Change standard fields of an employee profile (name, emails, start date, status, manager, job title). WRITES live HR data. Send only the fields to change. Setting user_status to pending needs a personal_email. Namely API: PUT /profiles/{id}.
```

## Changes things (1)

Creates or changes something that can be changed back. Claude Code: ask.

### `namely_get_report`

- The name "namely_get_report" says "get": a word for reading.
- The description's first verb is "run": a word for a change.
- The server marks it read-only (readOnlyHint: true), but an annotation never lowers a class.
- Findings: warn annotation-conflict

Description, as the server wrote it:

```untrusted-server-text
Run a saved Namely report by id and return its columns and rows (live data; each row is a list in column order). Find the id in the URL of the report in Namely. Reports can contain sensitive HR data such as salary history. Namely API: GET /reports/{id}.
```

## Only reads (13)

Looks things up and changes nothing. Claude Code: allow.

### `namely_get_group`

- The name "namely_get_group" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Get one group by id, with the profiles (members) linked to it. Namely API: GET /groups/{id}.
```

### `namely_get_me`

- The name "namely_get_me" says "get": a word for reading.
- Tag private-data: The description's first sentence says "get" and "email": it reads mail.
- Tag untrusted-input: The description's first sentence says "get" and "email": it reads inbound email, which other people can write.

Description, as the server wrote it:

```untrusted-server-text
Get the profile of the user the connected token belongs to (name, email, job title, manager, access role). Namely API: GET /profiles/me.
```

### `namely_get_profile`

- The name "namely_get_profile" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Get one employee's full profile by id: personal and job data, manager, groups, teams and the custom fields the token may see (can include compensation and other sensitive HR data). Namely API: GET /profiles/{id}.
```

### `namely_get_team`

- The name "namely_get_team" says "get": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
Get one team by id, with the profiles (members) linked to it. Namely API: GET /teams/{id}.
```

### `namely_list_event_comments`

- The name "namely_list_event_comments" says "list": a word for reading.
- Tag untrusted-input: The name "namely_list_event_comments" says "list" and "comment": it reads comments, which other people can write. The description's first sentence says "list" and "comment": it reads comments, which other people can write.

Description, as the server wrote it:

```untrusted-server-text
List the comments on a feed event. Namely API: GET /events/{event-id}/comments.
```

### `namely_list_events`

- The name "namely_list_events" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List events of the company home feed (announcements, birthdays, work anniversaries, new arrivals), newest first by default, with limit and after (an event id) for paging. Namely API: GET /events.
```

### `namely_list_group_types`

- The name "namely_list_group_types" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List the group types (the containers of groups, such as Department or Office). Namely API: GET /group_types.
```

### `namely_list_groups`

- The name "namely_list_groups" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List all groups (departments, office locations and other company groups). Every group belongs to one group type. Namely API: GET /groups.
```

### `namely_list_job_tiers`

- The name "namely_list_job_tiers" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List all job tiers (the levels that group job titles). Namely API: GET /job_tiers.
```

### `namely_list_job_titles`

- The name "namely_list_job_titles" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List all job titles; each belongs to one job tier. Namely API: GET /job_titles.
```

### `namely_list_profile_fields`

- The name "namely_list_profile_fields" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List the fields of the employee profile as configured at this company (standard and custom), with their labels, sections and the valid format of each value. Namely API: GET /profiles/fields.
```

### `namely_list_profiles`

- The name "namely_list_profiles" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List employee profiles (active, pending and inactive unless filtered) with paging, sorting and filters. Returns {profiles, meta:{count}, linked}. Use format=short for a smaller record (ids, names, email, status, job title); the full record includes every custom field the token may see (compensation, addresses and other sensitive HR data). An empty page means the end. Namely API: GET /profiles (limit 100 requests per minute).
```

### `namely_list_teams`

- The name "namely_list_teams" says "list": a word for reading.

Description, as the server wrote it:

```untrusted-server-text
List all teams with their team categories. Namely API: GET /teams.
```

## Claude Code permissions

For `.claude/settings.json`, assuming the server is installed as `namely`:

```json
{
  "permissions": {
    "allow": [
      "mcp__namely__namely_get_me",
      "mcp__namely__namely_list_profiles",
      "mcp__namely__namely_get_profile",
      "mcp__namely__namely_list_profile_fields",
      "mcp__namely__namely_list_groups",
      "mcp__namely__namely_get_group",
      "mcp__namely__namely_list_group_types",
      "mcp__namely__namely_list_teams",
      "mcp__namely__namely_get_team",
      "mcp__namely__namely_list_job_titles",
      "mcp__namely__namely_list_job_tiers",
      "mcp__namely__namely_list_events",
      "mcp__namely__namely_list_event_comments"
    ],
    "ask": [
      "mcp__namely__namely_get_report"
    ],
    "deny": [
      "mcp__namely__namely_update_profile",
      "mcp__namely__namely_create_announcement",
      "mcp__namely__namely_create_event_comment"
    ]
  }
}
```

Capability tags behind the rules (a read tagged outbound is asked about):

- `mcp__namely__namely_get_me`: private-data, untrusted-input
- `mcp__namely__namely_list_event_comments`: untrusted-input
- `mcp__namely__namely_create_event_comment`: outbound
