fiken-mcp
by heim
README.md
# fiken-mcp
A **read-only** [Model Context Protocol (MCP)](https://modelcontextprotocol.io) server for the [Fiken](https://fiken.no) accounting API. Exposes all Fiken GET endpoints as MCP tools so AI assistants (Claude, etc.) can query your accounting data directly.
> **Read-only guarantee:** This server only ever makes HTTP GET requests to the Fiken API. No data is created, modified, or deleted.
## Features
- 61 tools covering the full Fiken v2 read API
- Multi-company support — `companySlug` is a parameter on every tool
- Paginated list endpoints with metadata
- Serial request queue (respects Fiken's 1 concurrent request per user rule)
- Structured error responses — API errors are returned as tool results rather than crashing the session
## Requirements
- Node.js 18+
- A [Fiken API token](https://fiken.no/api/v2/documentation/#section/Authentication)
## Installation
```bash
git clone https://github.com/yourusername/fiken-mcp
cd fiken-mcp
npm install
npm run build
```
## Usage
### Claude Desktop
Add to your `claude_desktop_config.json`:
```json
{
"mcpServers": {
"fiken": {
"command": "node",
"args": ["/absolute/path/to/fiken-mcp/build/index.js"],
"env": {
"FIKEN_API_TOKEN": "your-token-here"
}
}
}
}
```
Config file locations:
- macOS: `~/Library/Application Support/Claude/claude_desktop_config.json`
- Windows: `%APPDATA%\Claude\claude_desktop_config.json`
### Claude Code
Add the server to your Claude Code project with:
```bash
claude mcp add fiken -- node /absolute/path/to/fiken-mcp/build/index.js
```
Then set the token:
```bash
claude mcp add fiken -e FIKEN_API_TOKEN=your-token-here -- node /absolute/path/to/fiken-mcp/build/index.js
```
Or if you prefer to keep the config in version control, add it to `.mcp.json` in your project root:
```json
{
"mcpServers": {
"fiken": {
"command": "node",
"args": ["/absolute/path/to/fiken-mcp/build/index.js"],
"env": {
"FIKEN_API_TOKEN": "your-token-here"
}
}
}
}
```
To verify the server is connected:
```bash
claude mcp list
```
### Other MCP clients
Run the server with the token in the environment:
```bash
FIKEN_API_TOKEN=your-token-here node build/index.js
```
### Development (no build step)
```bash
FIKEN_API_TOKEN=your-token-here npm run dev
```
### MCP Inspector
```bash
FIKEN_API_TOKEN=your-token-here npx @modelcontextprotocol/inspector node build/index.js
```
## Getting a Fiken API token
1. Log in to [fiken.no](https://fiken.no)
2. Go to **Settings → API** (or visit `https://fiken.no/api/v2/documentation`)
3. Generate a personal API token
4. Keep it secret — treat it like a password
## Available tools
Start with `fiken_list_companies` to get the `companySlug` values needed by all other tools.
### User
| Tool | Description |
|------|-------------|
| `fiken_get_user` | Get information about the currently authenticated Fiken user |
### Companies
| Tool | Description |
|------|-------------|
| `fiken_list_companies` | List all companies the authenticated user has access to |
| `fiken_get_company` | Get details for a specific company by slug |
### Accounts
| Tool | Description |
|------|-------------|
| `fiken_list_accounts` | List chart of accounts for a company |
| `fiken_get_account` | Get a specific account by account code |
| `fiken_list_account_balances` | List account balances for a company |
| `fiken_get_account_balance` | Get balance for a specific account |
### Bank
| Tool | Description |
|------|-------------|
| `fiken_list_bank_accounts` | List bank accounts for a company |
| `fiken_get_bank_account` | Get a specific bank account by ID |
| `fiken_list_bank_balances` | List bank balances for all bank accounts |
### Contacts
| Tool | Description |
|------|-------------|
| `fiken_list_contacts` | List contacts (customers and suppliers) |
| `fiken_get_contact` | Get a specific contact by ID |
| `fiken_list_contact_persons` | List contact persons for a contact |
| `fiken_get_contact_person` | Get a specific contact person |
| `fiken_list_contact_groups` | List contact groups |
### Invoices
| Tool | Description |
|------|-------------|
| `fiken_list_invoices` | List invoices |
| `fiken_get_invoice` | Get a specific invoice by ID |
| `fiken_list_invoice_attachments` | List attachments for an invoice |
| `fiken_get_invoice_counter` | Get the current invoice number counter |
| `fiken_list_invoice_drafts` | List invoice drafts |
| `fiken_get_invoice_draft` | Get a specific invoice draft |
| `fiken_list_invoice_draft_attachments` | List attachments for an invoice draft |
### Credit Notes
| Tool | Description |
|------|-------------|
| `fiken_list_credit_notes` | List credit notes |
| `fiken_get_credit_note` | Get a specific credit note |
| `fiken_get_credit_note_counter` | Get the current credit note number counter |
| `fiken_list_credit_note_drafts` | List credit note drafts |
| `fiken_get_credit_note_draft` | Get a specific credit note draft |
### Offers
| Tool | Description |
|------|-------------|
| `fiken_list_offers` | List offers/quotes |
| `fiken_get_offer` | Get a specific offer |
| `fiken_get_offer_counter` | Get the current offer number counter |
| `fiken_list_offer_drafts` | List offer drafts |
| `fiken_get_offer_draft` | Get a specific offer draft |
### Order Confirmations
| Tool | Description |
|------|-------------|
| `fiken_list_order_confirmations` | List order confirmations |
| `fiken_get_order_confirmation` | Get a specific order confirmation |
| `fiken_get_order_confirmation_counter` | Get the current order confirmation counter |
### Journal Entries
| Tool | Description |
|------|-------------|
| `fiken_list_journal_entries` | List journal entries |
| `fiken_get_journal_entry` | Get a specific journal entry |
| `fiken_list_journal_entry_attachments` | List attachments for a journal entry |
### Transactions
| Tool | Description |
|------|-------------|
| `fiken_list_transactions` | List transactions |
| `fiken_get_transaction` | Get a specific transaction |
### Sales
| Tool | Description |
|------|-------------|
| `fiken_list_sales` | List sales |
| `fiken_get_sale` | Get a specific sale |
| `fiken_list_sale_attachments` | List attachments for a sale |
| `fiken_list_sale_drafts` | List sale drafts |
| `fiken_get_sale_draft` | Get a specific sale draft |
| `fiken_list_sale_draft_attachments` | List attachments for a sale draft |
### Purchases
| Tool | Description |
|------|-------------|
| `fiken_list_purchases` | List purchases |
| `fiken_get_purchase` | Get a specific purchase |
| `fiken_list_purchase_attachments` | List attachments for a purchase |
| `fiken_list_purchase_drafts` | List purchase drafts |
| `fiken_get_purchase_draft` | Get a specific purchase draft |
### Products
| Tool | Description |
|------|-------------|
| `fiken_list_products` | List products |
| `fiken_get_product` | Get a specific product |
### Projects
| Tool | Description |
|------|-------------|
| `fiken_list_projects` | List projects |
| `fiken_get_project` | Get a specific project |
### Time Tracking
| Tool | Description |
|------|-------------|
| `fiken_list_time_entries` | List time entries |
| `fiken_get_time_entry` | Get a specific time entry |
| `fiken_list_activities` | List activities (used with time entries) |
| `fiken_list_time_users` | List users who can log time |
### Inbox
| Tool | Description |
|------|-------------|
| `fiken_list_inbox` | List inbox documents |
| `fiken_get_inbox_document` | Get a specific inbox document |
## Notes
- **Amounts** are returned in **øre (cents)** as integers, matching the Fiken API — e.g. `100000` means 1000.00 NOK
- **Account codes** are strings — e.g. `"1920"` or `"1500:10001"`
- **Pagination** defaults to page 0, 25 results per page (max 100)
- **Date filters** use `YYYY-MM-DD` format
## Development
```bash
npm test # run tests
npm run build # compile TypeScript
npm run dev # run without building (uses tsx)
```
## License
MIT
TDQS
B3.1/5.0
Scored across 61 tools
Disambiguation5/5
Every tool has a clearly distinct purpose: get tools retrieve a single resource by ID, list tools enumerate collections. There is no overlap or ambiguity between tools.
Naming Consistency5/5
All tools follow a consistent 'fiken_<verb>_<resource>' pattern, using 'get' for single items and 'list' for collections. Naming is uniform and predictable.
Tool Count2/5
61 read-only tools is excessive for the apparent scope. While the server covers many resources, the count feels bloated and could overwhelm users or agents.
Completeness2/5
The server provides comprehensive read access (get and list) for all major resources, but completely lacks create, update, or delete operations. This is a significant gap for most accounting workflows.
Maintenance
ActivityInactive
ResponsivenessNo issues