# Pylon
import ToolInfo from "@/app/_components/tool-info";
import Badges from "@/app/_components/badges";
import TabbedCodeBlock from "@/app/_components/tabbed-code-block";
import TableOfContents from "@/app/_components/table-of-contents";
import ToolFooter from "@/app/_components/tool-footer";
import { Callout } from "nextra/components";
The Pylon MCP Server lets agents work with Pylon’s issue management features—list and search issues, assign owners, add messages, browse contacts, users, and teams. There is **no OAuth** for Pylon; you must provide an **admin-generated API token**.
- **Issues**: list, search (BM25), fetch details, assign owners, update status, add messages
- **Contacts**: list and search by name or email
- **Users & Teams**: list/search users, list teams, get team details with members
- **User context**: fetch the API token owner profile (service account)
Pylon API tokens are admin-scoped and created in Pylon by an org admin. Store
the token as `PYLON_API_TOKEN` in Arcade secrets. There is no user OAuth.
## Available tools
If you need a tool that isn't listed, [contact us](mailto:contact@arcade.dev)
or [build your own](/guides/create-tools/tool-basics/build-mcp-server).
- `readOnlyHint` — reads data only - `openWorldHint` — calls Pylon’s external
API - `destructiveHint` — flags irreversible or hidden changes -
`idempotentHint` — repeating the same call has no extra effect
---
## User context
### Pylon.WhoAmI
Get the API token owner (service account) profile.
Returns name, email, and org info for the token owner.
**Parameters**
This tool takes no parameters.
- `readOnlyHint: true` - `openWorldHint: true`
GET `/me`
---
## Issue tools
### Pylon.ListIssues
List issues with optional filters.
**Parameters**
- **state** (`enum`, _optional_) Filter by state.
- **assignee_id** (`string`, _optional_) Filter by assignee ID.
- **team_id** (`string`, _optional_) Filter by team ID.
- **tags** (`array`, _optional_) Issues must include all provided tags.
- **start_time** (`string`, _optional_) RFC3339 start time. Default: 7 days ago.
- **end_time** (`string`, _optional_) RFC3339 end time. Default: now.
- **cursor** (`string`, _optional_) Pagination cursor.
GET `/issues`
---
### Pylon.GetIssue
Get detailed issue info by ID or keyword search (BM25).
**Parameters**
- **lookup_by** (`enum`, **required**) `id` or `search`.
- **value** (`string`, **required**) Issue ID/number or search keywords.
- **auto_accept_matches** (`boolean`, _optional_) Auto-accept search matches above confidence threshold. Default: `false`.
GET `/issues/{id}` or GET `/issues` (search)
---
### Pylon.SearchIssues
Keyword search across recent issues (BM25).
**Parameters**
- **query** (`string`, **required**) Keywords (supports AND/OR/NOT).
- **auto_accept_matches** (`boolean`, _optional_) Auto-accept high-confidence matches. Default: `false`.
GET `/issues` (fetch recent issues for ranking)
---
### Pylon.AssignIssue
Assign an issue to a user (ID or fuzzy name).
**Parameters**
- **issue_lookup_by** (`enum`, **required**) `id` or `search`.
- **issue_value** (`string`, **required**) Issue ID/number or search keywords.
- **user_lookup_by** (`enum`, **required**) `id` or `name`.
- **user_value** (`string`, **required**) User ID or name (fuzzy match).
- **auto_accept_matches** (`boolean`, _optional_) Auto-accept fuzzy/BM25 matches. Default: `false`.
GET `/issues/{id}`, GET `/issues`, GET `/users`, PATCH `/issues/{id}`
---
### Pylon.UpdateIssueStatus
Change the state of an issue.
**Parameters**
- **state** (`enum`, **required**) New state.
- **lookup_by** (`enum`, **required**) `id` or `search`.
- **value** (`string`, **required**) Issue ID/number or keywords.
- **auto_accept_matches** (`boolean`, _optional_) Auto-accept search matches. Default: `false`.
GET `/issues/{id}`, GET `/issues`, PATCH `/issues/{id}`
---
### Pylon.AddMessage
Add an internal note to an issue.
**Parameters**
- **issue_id** (`string`, **required**) Issue ID or number.
- **body** (`string`, **required**) Message content.
- **as_html** (`boolean`, _optional_) Body is pre-formatted HTML. Default: `false`.
POST `/issues/{id}/note`
---
## Contact tools
### Pylon.ListContacts
List contacts with pagination.
**Parameters**
- **cursor** (`string`, _optional_) Pagination cursor.
GET `/contacts`
---
### Pylon.SearchContacts
Search contacts by name or email.
**Parameters**
- **query** (`string`, **required**) Name or email.
- **auto_accept_matches** (`boolean`, _optional_) Auto-accept matches above confidence threshold. Default: `false`.
POST `/contacts/search`, GET `/contacts`
---
## User tools
### Pylon.ListUsers
List users in the workspace.
**Parameters**
- **cursor** (`string`, _optional_) Pagination cursor.
- **limit** (`integer`, _optional_) Items per page. Default: 20.
GET `/users`
---
### Pylon.SearchUsers
Search users by name (fuzzy).
**Parameters**
- **query** (`string`, **required**) Name or partial name.
- **auto_accept_matches** (`boolean`, _optional_) Auto-accept matches above confidence threshold. Default: `false`.
GET `/users`
---
## Team tools
### Pylon.ListTeams
List teams in the workspace.
**Parameters**
- **cursor** (`string`, _optional_) Pagination cursor.
GET `/teams`
---
### Pylon.GetTeamAndAssignment
Get team details (with members) by ID or fuzzy name.
**Parameters**
- **lookup_by** (`enum`, **required**) `id` or `name`.
- **value** (`string`, **required**) Team ID or name.
- **auto_accept_matches** (`boolean`, _optional_) Auto-accept fuzzy matches. Default: `false`.
GET `/teams`, GET `/teams/{id}`
---
## Auth
Pylon uses Bearer tokens created by an org admin. There is **no OAuth flow**. Generate an API token in the Pylon dashboard and store it as the secret `PYLON_API_TOKEN` in Arcade. All tools require this secret.
**Auth header**
```
Authorization: Bearer
```
Pylon tokens are generated by admins in the Pylon UI and grant org-level
access. Rotate tokens regularly and scope storage to your Arcade project’s
secrets.
Refer to Pylon’s authentication docs: [Pylon API Authentication](https://docs.usepylon.com/pylon-docs/developer/api/authentication).