Skip to main content
Glama
ArmandSwirc

TimeChimp MCP Server

by ArmandSwirc

TimeChimp MCP Server

A comprehensive Model Context Protocol (MCP) server for interacting with TimeChimp API v2. This server provides tools for retrieving and managing all major TimeChimp resources including projects, users, time entries, contacts, customers, tasks, invoices, expenses, mileage, and tags.

Features

  • Projects: Full CRUD operations (Create, Read, Update, Delete) with comprehensive project management including invoicing, budgeting, task/user assignments, and insights

  • Users: Full CRUD operations (Create, Read, Update, Delete) with user management including roles, contracts, tags, and employee information

  • Time Entries: Fetch time entries with date ranges, user/project filtering, and sorting

  • Contacts: Full CRUD operations (Create, Read, Update, Delete) for contact management

  • Customers: Full CRUD operations (Create, Read, Update, Delete) for customer management

  • Tasks: Get task information with project filtering and sorting

  • Invoices: Retrieve invoices with customer and date filtering

  • Expenses: Full CRUD operations (Create, Read, Update, Delete) for expense management with status tracking

  • Mileage: Full CRUD operations (Create, Read, Update, Delete) for mileage management with status tracking and vehicle assignment

  • Mileage Vehicles: Retrieve mileage vehicle information for vehicle assignment

  • Tags: Get tag information for organization and categorization

  • Built as a single JavaScript file for easy deployment

  • Uses TimeChimp API v2 with proper authentication and OData conventions

  • Comprehensive error handling and validation

  • Support for $expand, $count, and all OData query parameters

Related MCP server: Timesheet MCP Server

Prerequisites

  • Node.js 18.0.0 or higher

  • A TimeChimp account with API access

  • TimeChimp API key

Installation

  1. Clone or download this repository:

git clone <repository-url>
cd TimeJS
  1. Install dependencies:

npm install
  1. Make the server executable:

chmod +x timechimp-mcp-server.js

Configuration

API Key Setup

You need to set your TimeChimp API key as an environment variable:

export TIMECHIMP_API_KEY="your-api-key-here"

Or create a .env file:

TIMECHIMP_API_KEY=your-api-key-here

Getting Your TimeChimp API Key

  1. Log in to your TimeChimp account

  2. Go to your profile settings

  3. Navigate to the API section

  4. Generate or copy your API key

Claude Desktop Integration

To use this TimeChimp MCP server with Claude Desktop, you need to add it to your Claude Desktop configuration.

Step 1: Clone the Repository

git clone https://github.com/Sungdaddy/TimeyChimpey.git
cd TimeyChimpey
npm install

Step 2: Set Up Your API Key

Create a .env file in the project directory:

echo "TIMECHIMP_API_KEY=your-actual-api-key-here" > .env

Step 3: Configure Claude Desktop

Add the following configuration to your Claude Desktop settings. The location of the configuration file depends on your operating system:

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json Windows: %APPDATA%\Claude\claude_desktop_config.json

{
  "mcpServers": {
    "timechimp": {
      "command": "node",
      "args": ["timechimp-mcp-server.js"],
      "cwd": "/path/to/your/TimeyChimpey",
      "env": {
        "TIMECHIMP_API_KEY": "your-actual-api-key-here"
      }
    }
  }
}

Important: Replace /path/to/your/TimeyChimpey with the actual path to where you cloned the repository, and replace your-actual-api-key-here with your actual TimeChimp API key.

Step 4: Restart Claude Desktop

After adding the configuration, restart Claude Desktop completely for the changes to take effect.

Step 5: Verify Integration

Once Claude Desktop restarts, you should be able to use TimeChimp-related commands. Try asking Claude to:

  • "Get all my projects from TimeChimp"

  • "Show me recent time entries"

  • "List all customers"

  • "Create a new expense entry"

Example Configuration

Here's a complete example configuration file:

{
  "mcpServers": {
    "timechimp": {
      "command": "node",
      "args": ["timechimp-mcp-server.js"],
      "cwd": "/Users/yourname/TimeyChimpey",
      "env": {
        "TIMECHIMP_API_KEY": "your-actual-api-key-here"
      }
    }
  }
}

Troubleshooting Claude Desktop Integration

  1. Server not connecting: Ensure the path in cwd is correct and points to the directory containing timechimp-mcp-server.js

  2. API key errors: Verify your API key is correct and has proper permissions in TimeChimp

  3. Node.js not found: Make sure Node.js is installed and accessible from the command line

  4. Permission errors: Ensure Claude Desktop has permission to execute Node.js and access the project directory

  5. Configuration not loading: Double-check the JSON syntax in your configuration file - it must be valid JSON

Available Tools in Claude Desktop

Once configured, you'll have access to all 46 TimeChimp tools through Claude Desktop:

  • Projects: Create, read, update, delete projects with insights

  • Users: Manage users with contracts and roles

  • Time Entries: Track and manage time entries

  • Contacts: Full contact management

  • Customers: Complete customer lifecycle management

  • Expenses: Expense tracking with approval workflows

  • Mileage: Mileage tracking with vehicle management

  • And much more...

You can ask Claude to perform any TimeChimp operation naturally, such as "Create a new project for client ABC" or "Show me all pending expenses that need approval."

Usage

Running the Server

# Start the server
npm start

# Or run directly
node timechimp-mcp-server.js

# For development with debugging
npm run dev

Available Tools

Projects

1. get_projects

Retrieve projects from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of projects to return (1-10000, default: 100)

  • skip (number, optional): Number of projects to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand (e.g., "customer,tasks")

  • active_only (boolean, optional): Only return active projects (default: false)

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

Example:

{
  "name": "get_projects",
  "arguments": {
    "top": 50,
    "active_only": true,
    "expand": "customer,tasks",
    "orderby": "name desc"
  }
}
2. get_project_by_id

Get a specific project by ID.

Parameters:

  • id (number, required): Project ID

  • expand (string, optional): Comma-delimited list of properties to expand

Example:

{
  "name": "get_project_by_id",
  "arguments": {
    "id": 123,
    "expand": "customer,tasks"
  }
}
3. create_project

Create a new project.

Parameters:

  • name (string, required): The project name

  • active (boolean, optional): Whether the project can be used (default: true)

  • code (string, optional): The project code

  • notes (string, optional): The project description

  • color (string, optional): The project color

  • startDate (string, optional): The project start date (YYYY-MM-DD format)

  • endDate (string, optional): The project end date (YYYY-MM-DD format)

  • invoicing (object, optional): The project invoicing settings

    • method (string, optional): The project invoicing method used

      • Allowed values: NoInvoicing, TaskHourlyRate, UserHourlyRate, ProjectHourlyRate, CustomerHourlyRate, ProjectRate, TaskRate

    • hourlyRate (number, optional): The hourly rate of the project (only used when invoicing method = ProjectHourlyRate)

    • fixedRate (number, optional): The fixed rate/price of the project (only used when invoicing method = ProjectRate)

    • reference (string, optional): The project invoicing reference

    • date (string, optional): The project invoicing date (YYYY-MM-DD format, only used when invoicing method = ProjectRate)

  • budget (object, optional): The project budget settings

    • method (string, optional): The project budget method used

      • Allowed values: NoBudget, TotalHours, TaskHours, UserHours, TotalRate, TaskRate, TotalCost

    • hours (number, optional): The hourly budget of the project (only used when budget method = TotalHours)

    • rate (number, optional): The budget rate of the project (only used when budget method = TotalRate or TotalCost)

    • notificationPercentage (number, optional): The budget percentage threshold at which a notification is sent out

  • customer (object, optional): Customer to be linked with the project

    • id (number, required): Unique identifier for the customer

  • mainProject (object, optional): Main project to be linked with the project (if it is a subproject)

    • id (number, required): Unique identifier for the project

  • subprojects (array, optional): List of subprojects to be linked to the project (if it is a main project)

  • managers (array, optional): List of managers to be linked to the project

  • tags (array, optional): List of tags to be linked to the project

  • projectTasks (array, required): List of project tasks to be linked to the project (if no tasks are specified, active common tasks will be prefilled)

  • projectUsers (array, required): List of project users to be linked to the project (if no users are specified, active users will be prefilled)

Example:

{
  "name": "create_project",
  "arguments": {
    "name": "Website Redesign",
    "code": "WEB-2024",
    "notes": "Complete redesign of company website",
    "color": "#3498db",
    "startDate": "2024-01-15",
    "endDate": "2024-06-30",
    "invoicing": {
      "method": "ProjectHourlyRate",
      "hourlyRate": 125.00,
      "reference": "WEB-2024-INV"
    },
    "budget": {
      "method": "TotalHours",
      "hours": 400,
      "notificationPercentage": 80
    },
    "customer": {"id": 123},
    "managers": [{"id": 456}],
    "tags": [{"id": 1}, {"id": 2}],
    "projectTasks": [
      {
        "active": true,
        "billable": true,
        "hourlyRate": 125.00,
        "task": {"id": 789}
      }
    ],
    "projectUsers": [
      {
        "active": true,
        "hourlyRate": 125.00,
        "budgetHours": 200,
        "user": {"id": 101}
      }
    ]
  }
}
4. update_project

Update an existing project.

Parameters:

  • id (number, required): Project ID

  • name (string, required): The project name

  • active (boolean, optional): Whether the project can be used

  • code (string, optional): The project code

  • notes (string, optional): The project description

  • color (string, optional): The project color

  • startDate (string, optional): The project start date (YYYY-MM-DD format)

  • endDate (string, optional): The project end date (YYYY-MM-DD format)

  • invoicing (object, required): The project invoicing settings

    • method (string, optional): The project invoicing method used

      • Allowed values: NoInvoicing, TaskHourlyRate, UserHourlyRate, ProjectHourlyRate, CustomerHourlyRate, ProjectRate, TaskRate, Subscription

    • hourlyRate (number, optional): The hourly rate of the project (only used when invoicing method = ProjectHourlyRate)

    • fixedRate (number, optional): The fixed rate/price of the project (only used when invoicing method = ProjectRate)

    • reference (string, optional): The project invoicing reference

    • date (string, optional): The project invoicing date (YYYY-MM-DD format, only used when invoicing method = ProjectRate)

  • budget (object, required): The project budget settings

    • method (string, optional): The project budget method used

      • Allowed values: NoBudget, TotalHours, TaskHours, UserHours, TotalRate, TaskRate, Invoiced, TotalCost

    • hours (number, optional): The hourly budget of the project (only used when budget method = TotalHours)

    • rate (number, optional): The budget rate of the project (only used when budget method = TotalRate or TotalCost)

    • notificationPercentage (number, optional): The budget percentage threshold at which a notification is sent out

  • customer (object, optional): Customer to be linked with the project

    • id (number, required): Unique identifier for the customer

  • mainProject (object, optional): Main project to be linked with the project (if it is a subproject)

    • id (number, required): Unique identifier for the project

  • subprojects (array, optional): List of subprojects to be linked to the project (if it is a main project)

  • managers (array, optional): List of managers to be linked to the project

  • tags (array, optional): List of tags to be linked to the project

  • projectTasks (array, required): List of project tasks to be linked to the project

  • projectUsers (array, required): List of project users to be linked to the project

Example:

{
  "name": "update_project",
  "arguments": {
    "id": 123,
    "name": "Website Redesign - Phase 2",
    "endDate": "2024-08-31",
    "invoicing": {
      "method": "ProjectHourlyRate",
      "hourlyRate": 150.00
    },
    "budget": {
      "method": "TotalHours",
      "hours": 600,
      "notificationPercentage": 85
    },
    "projectTasks": [
      {
        "id": 456,
        "active": true,
        "billable": true,
        "hourlyRate": 150.00,
        "budgetHours": 120,
        "task": {"id": 789}
      }
    ],
    "projectUsers": [
      {
        "id": 789,
        "active": true,
        "hourlyRate": 150.00,
        "budgetHours": 300,
        "costHourlyRate": 90.00,
        "user": {"id": 101}
      }
    ]
  }
}
5. delete_project

Delete a project.

Parameters:

  • id (number, required): Project ID

Example:

{
  "name": "delete_project",
  "arguments": {
    "id": 123
  }
}
6. get_project_insights

Get project insights including hours, budget, costs, and revenue data.

Parameters:

  • id (number, required): Project ID

Example:

{
  "name": "get_project_insights",
  "arguments": {
    "id": 123
  }
}

Users

7. get_users

Retrieve users from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of users to return (1-10000, default: 100)

  • skip (number, optional): Number of users to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand

  • active_only (boolean, optional): Only return active users (default: false)

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

Example:

{
  "name": "get_users",
  "arguments": {
    "top": 100,
    "filter": "firstName eq 'John' and active eq true",
    "orderby": "lastName asc"
  }
}
8. get_user_by_id

Get a specific user by ID.

Parameters:

  • id (number, required): User ID

  • expand (string, optional): Comma-delimited list of properties to expand

9. create_user

Create a new user (note: adding users can result in additional invoice and extra cost).

Parameters:

  • userName (string, required): The user email address

  • displayName (string, required): The user name

  • language (string, optional): The user language (default: en)

    • Allowed values: en, nl, de, pl, fr, es

  • role (object, optional): Role to be assigned to the user (default: User)

    • id (number, required): Unique identifier for the role

  • sendInvitation (boolean, optional): Whether an invitation should be sent to the user (default: false)

  • contracts (array, optional): List of user contracts to be linked

    • startDate (string, optional): The contract start date (YYYY-MM-DD format, default: UTC today)

    • endDate (string, optional): The contract end date (YYYY-MM-DD format)

    • weekHours (number, optional): The contract hours per week

    • hourlyRate (number, optional): The contract sales hourly rate

    • costHourlyRate (number, optional): The contract purchase hourly rate

    • contractNumber (string, optional): The contract number

    • contractType (object, required): Contract type to be linked to the contract

      • id (number, required): Unique identifier for the contract type

Example:

{
  "name": "create_user",
  "arguments": {
    "userName": "john.doe@company.com",
    "displayName": "John Doe",
    "language": "en",
    "role": {"id": 2},
    "sendInvitation": true,
    "contracts": [
      {
        "startDate": "2024-01-15",
        "endDate": "2024-12-31",
        "weekHours": 40,
        "hourlyRate": 75.00,
        "costHourlyRate": 50.00,
        "contractNumber": "EMP-2024-001",
        "contractType": {"id": 1}
      }
    ]
  }
}
10. update_user

Update an existing user.

Parameters:

  • id (number, required): User ID

  • displayName (string, required): The user name

  • language (string, optional): The user language (default: en)

    • Allowed values: en, nl, de, pl, fr, es

  • employeeNumber (string, optional): The user employee number

  • badgeNumber (string, optional): The user badge number

  • citizenServiceNumber (string, optional): The user citizen service number

  • role (object, optional): Role to be assigned to the user (default: User)

    • id (number, required): Unique identifier for the role

  • tags (array, optional): List of tags to be linked with the user

  • contracts (array, optional): List of user contracts to be linked

    • id (number, optional): Unique identifier for the user contract (can be null if new user contract needs to be added)

    • startDate (string, optional): The contract start date (YYYY-MM-DD format, default: UTC today)

    • endDate (string, optional): The contract end date (YYYY-MM-DD format)

    • weekHours (number, optional): The contract hours per week

    • hourlyRate (number, optional): The contract sales hourly rate

    • costHourlyRate (number, optional): The contract purchase/cost hourly rate

    • contractNumber (string, optional): The contract number

    • contractType (object, required): Contract type to be linked with the contract

      • id (number, required): Unique identifier for the contract type

Example:

{
  "name": "update_user",
  "arguments": {
    "id": 123,
    "displayName": "John Doe - Senior Developer",
    "language": "en",
    "employeeNumber": "EMP-001",
    "badgeNumber": "BADGE-001",
    "role": {"id": 3},
    "tags": [{"id": 1}, {"id": 2}],
    "contracts": [
      {
        "id": 456,
        "startDate": "2024-01-15",
        "endDate": "2024-12-31",
        "weekHours": 40,
        "hourlyRate": 85.00,
        "costHourlyRate": 55.00,
        "contractNumber": "EMP-2024-001-UPD",
        "contractType": {"id": 1}
      }
    ]
  }
}

Time Entries

11. get_time_entries

Retrieve time entries from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of time entries to return (1-10000, default: 100)

  • skip (number, optional): Number of time entries to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand (e.g., "user,project,task")

  • user_id (string, optional): Filter by specific user ID

  • project_id (string, optional): Filter by specific project ID

  • from_date (string, optional): Start date for filtering (YYYY-MM-DD format)

  • to_date (string, optional): End date for filtering (YYYY-MM-DD format)

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

Example:

{
  "name": "get_time_entries",
  "arguments": {
    "top": 100,
    "from_date": "2024-01-01",
    "to_date": "2024-01-31",
    "user_id": "123",
    "expand": "user,project,task",
    "orderby": "date desc"
  }
}
12. get_time_entry_by_id

Get a specific time entry by ID.

Parameters:

  • id (number, required): Time entry ID

  • expand (string, optional): Comma-delimited list of properties to expand

Contacts

13. get_contacts

Retrieve all contacts from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of contacts to return (1-10000, default: 100)

  • skip (number, optional): Number of contacts to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand (e.g., "customers")

  • active_only (boolean, optional): Only return active contacts (default: false)

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

Example:

{
  "name": "get_contacts",
  "arguments": {
    "top": 50,
    "expand": "customers",
    "filter": "name eq 'John Doe'",
    "orderby": "name asc"
  }
}
14. get_contact_by_id

Get a specific contact by ID.

Parameters:

  • id (number, required): Contact ID

  • expand (string, optional): Comma-delimited list of properties to expand

15. create_contact

Create a new contact.

Parameters:

  • name (string, required): The contact name

  • jobTitle (string, optional): The contact job title

  • email (string, optional): The contact email address

  • phone (string, optional): The contact phone number

  • useForInvoicing (boolean, optional): Whether the contact info will be used for invoicing (default: false)

  • active (boolean, optional): Whether the contact can be used (default: true)

  • customers (array, optional): List of customer IDs to link to this contact

Example:

{
  "name": "create_contact",
  "arguments": {
    "name": "John Doe",
    "jobTitle": "Project Manager",
    "email": "john.doe@example.com",
    "phone": "+1234567890",
    "useForInvoicing": true,
    "customers": [{"id": 123}, {"id": 456}]
  }
}
16. update_contact

Update an existing contact.

Parameters:

  • id (number, required): Contact ID

  • name (string, required): The contact name

  • jobTitle (string, optional): The contact job title

  • email (string, optional): The contact email address

  • phone (string, optional): The contact phone number

  • useForInvoicing (boolean, optional): Whether the contact info will be used for invoicing

  • active (boolean, optional): Whether the contact can be used

  • customers (array, optional): List of customer IDs to link to this contact

17. delete_contact

Delete a contact.

Parameters:

  • id (number, required): Contact ID

Example:

{
  "name": "delete_contact",
  "arguments": {
    "id": 123
  }
}

Customers

18. get_customers

Retrieve all customers from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of customers to return (1-10000, default: 100)

  • skip (number, optional): Number of customers to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand (e.g., "contacts,projects")

  • active_only (boolean, optional): Only return active customers (default: false)

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

19. get_customer_by_id

Get a specific customer by ID.

Parameters:

  • id (number, required): Customer ID

  • expand (string, optional): Comma-delimited list of properties to expand

20. create_customer

Create a new customer.

Parameters:

  • name (string, required): The customer name

  • active (boolean, optional): Whether the customer can be used (default: true)

  • relationId (string, optional): The customer number

  • address (object, optional): The customer address info

    • address (string, optional): The address line

    • postalCode (string, optional): The postal code

    • city (string, optional): The city

    • country (string, optional): The country

  • phone (string, optional): The customer phone number

  • email (string, optional): The customer email address

  • website (string, optional): The customer website URL

  • paymentPeriod (number, optional): The customer payment term in days

  • hourlyRate (number, optional): The customer default hourly price

  • mileageRate (number, optional): The customer default mileage price, per KM

  • iban (string, optional): The customer IBAN

  • bic (string, optional): The customer BIC

  • vatNumber (string, optional): The customer VAT number

  • kvkNumber (string, optional): The customer business ID

  • invoiceAddress (object, optional): The customer invoice address info, override of the customer address info

    • address (string, optional): The address line

    • postalCode (string, optional): The postal code

    • city (string, optional): The city

    • country (string, optional): The country

  • notes (string, optional): The customer notes

  • prospect (boolean, optional): The customer is a prospect

  • vatRate (object, optional): Vat rate to be used for this customer

    • id (number, required): Unique identifier for the vat rate

  • tags (array, optional): List of tag IDs to link to this customer

  • contacts (array, optional): List of contact IDs to link to this customer

Example:

{
  "name": "create_customer",
  "arguments": {
    "name": "Acme Corporation",
    "email": "contact@acme.com",
    "phone": "+1234567890",
    "website": "https://acme.com",
    "address": {
      "address": "123 Business St",
      "postalCode": "12345",
      "city": "Business City",
      "country": "USA"
    },
    "paymentPeriod": 30,
    "hourlyRate": 150.00,
    "prospect": false,
    "tags": [{"id": 1}, {"id": 2}],
    "contacts": [{"id": 123}]
  }
}
21. update_customer

Update an existing customer.

Parameters:

  • id (number, required): Customer ID

  • name (string, required): The customer name

  • active (boolean, optional): Whether the customer can be used

  • relationId (string, optional): The customer number

  • address (object, optional): The customer address info

    • address (string, optional): The address line

    • postalCode (string, optional): The postal code

    • city (string, optional): The city

    • country (string, optional): The country

  • phone (string, optional): The customer phone number

  • email (string, optional): The customer email address

  • website (string, optional): The customer website URL

  • paymentPeriod (number, optional): The customer payment term in days

  • hourlyRate (number, optional): The customer default hourly price

  • mileageRate (number, optional): The customer default mileage price, per KM

  • iban (string, optional): The customer IBAN

  • bic (string, optional): The customer BIC

  • vatNumber (string, optional): The customer VAT number

  • kvkNumber (string, optional): The customer business ID

  • invoiceAddress (object, optional): The customer invoice address info, if differs from the customer address info

    • address (string, optional): The address line

    • postalCode (string, optional): The postal code

    • city (string, optional): The city

    • country (string, optional): The country

  • notes (string, optional): The customer notes

  • prospect (boolean, optional): The customer is a prospect

  • vatRate (object, optional): Vat rate to be linked with the customer

    • id (number, required): Unique identifier for the vat rate

  • tags (array, optional): List of tag IDs to link to this customer

  • contacts (array, optional): List of contact IDs to link to this customer

Example:

{
  "name": "update_customer",
  "arguments": {
    "id": 456,
    "name": "Acme Corporation Ltd",
    "email": "newcontact@acme.com",
    "paymentPeriod": 45,
    "hourlyRate": 175.00
  }
}
22. delete_customer

Delete a customer.

Parameters:

  • id (number, required): Customer ID

Example:

{
  "name": "delete_customer",
  "arguments": {
    "id": 456
  }
}

Tasks

23. get_tasks

Retrieve all tasks from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of tasks to return (1-10000, default: 100)

  • skip (number, optional): Number of tasks to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand (e.g., "project")

  • active_only (boolean, optional): Only return active tasks (default: false)

  • project_id (string, optional): Filter by specific project ID

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

24. get_task_by_id

Get a specific task by ID.

Parameters:

  • id (number, required): Task ID

  • expand (string, optional): Comma-delimited list of properties to expand

Invoices

25. get_invoices

Retrieve all invoices from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of invoices to return (1-10000, default: 100)

  • skip (number, optional): Number of invoices to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand (e.g., "customer,projects")

  • customer_id (string, optional): Filter by specific customer ID

  • from_date (string, optional): Start date for filtering (YYYY-MM-DD format)

  • to_date (string, optional): End date for filtering (YYYY-MM-DD format)

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

26. get_invoice_by_id

Get a specific invoice by ID.

Parameters:

  • id (number, required): Invoice ID

  • expand (string, optional): Comma-delimited list of properties to expand

Expenses

27. get_expenses

Retrieve all expenses from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of expenses to return (1-10000, default: 100)

  • skip (number, optional): Number of expenses to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand (e.g., "user,project,customer")

  • user_id (string, optional): Filter by specific user ID

  • project_id (string, optional): Filter by specific project ID

  • customer_id (string, optional): Filter by specific customer ID

  • from_date (string, optional): Start date for filtering (YYYY-MM-DD format)

  • to_date (string, optional): End date for filtering (YYYY-MM-DD format)

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

28. get_expense_by_id

Get a specific expense by ID.

Parameters:

  • id (number, required): Expense ID

  • expand (string, optional): Comma-delimited list of properties to expand

29. create_expense

Create a new expense.

Parameters:

  • date (string, optional): The expense date (YYYY-MM-DD format, default: UTC today)

  • notes (string, optional): The expense notes

  • quantity (number, optional): The expense quantity (default: 1)

  • rate (number, required): The expense rate/price

  • billable (boolean, optional): Whether the expense can be invoiced (default: true)

  • customer (object, optional): Customer to be linked with the expense

    • id (number, required): Unique identifier for the customer

  • project (object, optional): Project to be linked with the expense

    • id (number, required): Unique identifier for the project

  • product (object, optional): Product to be linked with the expense

    • id (number, required): Unique identifier for the product

  • user (object, required): User to be linked with the expense

    • id (number, required): Unique identifier for the user

  • vatRate (object, optional): VAT rate to be linked with the expense (default: highest percentage)

    • id (number, required): Unique identifier for the VAT rate

Example:

{
  "name": "create_expense",
  "arguments": {
    "date": "2024-01-15",
    "notes": "Business lunch with client",
    "quantity": 1,
    "rate": 75.50,
    "billable": true,
    "customer": {"id": 123},
    "project": {"id": 456},
    "user": {"id": 789}
  }
}
30. update_expense

Update an existing expense.

Parameters:

  • id (number, required): Expense ID

  • date (string, optional): The expense date (YYYY-MM-DD format)

  • notes (string, optional): The expense notes

  • quantity (number, optional): The expense quantity

  • rate (number, required): The expense rate/price

  • billable (boolean, optional): Whether the expense can be invoiced

  • customer (object, optional): Customer to be linked with the expense

    • id (number, required): Unique identifier for the customer

  • project (object, optional): Project to be linked with the expense

    • id (number, required): Unique identifier for the project

  • product (object, optional): Product to be linked with the expense

    • id (number, required): Unique identifier for the product

  • user (object, required): User to be linked with the expense

    • id (number, required): Unique identifier for the user

  • vatRate (object, optional): VAT rate to be linked with the expense

    • id (number, required): Unique identifier for the VAT rate

Example:

{
  "name": "update_expense",
  "arguments": {
    "id": 123,
    "notes": "Updated: Business lunch with client and partner",
    "rate": 85.00,
    "user": {"id": 789}
  }
}
31. delete_expense

Delete an expense.

Parameters:

  • id (number, required): Expense ID

Example:

{
  "name": "delete_expense",
  "arguments": {
    "id": 123
  }
}
32. update_expense_status

Update the status of expenses (internal approval/invoicing status).

Parameters:

  • message (string, optional): Status history message

  • expenses (array, required): List of expenses to be updated (maximum of 100 entries)

    • id (number, required): Unique identifier for the expense

  • status (string, required): The internal approval/invoicing status

    • Allowed values: Open, PendingApproval, Approved, Invoiced, WrittenOff, Rejected

Example:

{
  "name": "update_expense_status",
  "arguments": {
    "message": "Approved by manager",
    "expenses": [{"id": 123}, {"id": 124}],
    "status": "Approved"
  }
}
33. update_expense_client_status

Update the client status of expenses (external approval/invoicing status).

Parameters:

  • clientStatus (string, required): The external approval/invoicing status (used only when client portal is enabled)

    • Allowed values: Open, PendingApproval, Approved, Invoiced, WrittenOff, Rejected

  • message (string, optional): Status history message

  • expenses (array, required): List of expenses to be updated (maximum of 100 entries)

    • id (number, required): Unique identifier for the expense

Example:

{
  "name": "update_expense_client_status",
  "arguments": {
    "clientStatus": "Approved",
    "message": "Client approved expenses",
    "expenses": [{"id": 123}, {"id": 124}]
  }
}
34. get_expense_status_history

Query status history modification records of an expense.

Parameters:

  • id (number, required): Expense ID

  • top (number, optional): Maximum number of status history records to return (1-10000, default: 100)

  • skip (number, optional): Number of status history records to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression (e.g., "modifiedOn desc")

Example:

{
  "name": "get_expense_status_history",
  "arguments": {
    "id": 123,
    "orderby": "modifiedOn desc",
    "top": 50
  }
}

Mileage

35. get_mileage

Retrieve all mileage entries from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of mileage entries to return (1-10000, default: 100)

  • skip (number, optional): Number of mileage entries to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand (e.g., "user,project,customer")

  • user_id (string, optional): Filter by specific user ID

  • project_id (string, optional): Filter by specific project ID

  • customer_id (string, optional): Filter by specific customer ID

  • from_date (string, optional): Start date for filtering (YYYY-MM-DD format)

  • to_date (string, optional): End date for filtering (YYYY-MM-DD format)

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

36. get_mileage_by_id

Get a specific mileage entry by ID.

Parameters:

  • id (number, required): Mileage entry ID

  • expand (string, optional): Comma-delimited list of properties to expand

37. create_mileage

Create a new mileage entry.

Parameters:

  • date (string, optional): The mileage date (YYYY-MM-DD format, default: UTC today)

  • fromAddress (string, optional): The mileage from address

  • toAddress (string, optional): The mileage to address

  • notes (string, optional): The mileage notes

  • distance (number, required): The mileage distance in KM

  • billable (boolean, optional): Whether the mileage can be invoiced (default: true)

  • type (string, required): The mileage type

    • Allowed values: Private, Business, HomeWork

  • customer (object, optional): Customer to be linked with the mileage

    • id (number, required): Unique identifier for the customer

  • project (object, optional): Project to be linked with the mileage

    • id (number, required): Unique identifier for the project

  • vehicle (object, optional): Vehicle to be linked with the mileage

    • id (number, required): Unique identifier for the mileage vehicle

  • user (object, required): User to be linked with the mileage

    • id (number, required): Unique identifier for the user

Example:

{
  "name": "create_mileage",
  "arguments": {
    "date": "2024-01-15",
    "fromAddress": "Office - 123 Business St, Business City",
    "toAddress": "Client Site - 456 Client Ave, Client City",
    "notes": "Client meeting and project consultation",
    "distance": 45.5,
    "billable": true,
    "type": "Business",
    "customer": {"id": 123},
    "project": {"id": 456},
    "vehicle": {"id": 789},
    "user": {"id": 101}
  }
}
38. update_mileage

Update an existing mileage entry.

Parameters:

  • id (number, required): Mileage entry ID

  • date (string, optional): The mileage date (YYYY-MM-DD format)

  • fromAddress (string, optional): The mileage from address

  • toAddress (string, optional): The mileage to address

  • notes (string, optional): The mileage notes

  • distance (number, required): The mileage distance in KM

  • billable (boolean, optional): Whether the mileage can be invoiced

  • type (string, required): The mileage type

    • Allowed values: Private, Business, HomeWork

  • customer (object, optional): Customer to be linked with the mileage

    • id (number, required): Unique identifier for the customer

  • project (object, optional): Project to be linked with the mileage

    • id (number, required): Unique identifier for the project

  • vehicle (object, optional): Vehicle to be linked with the mileage

    • id (number, required): Unique identifier for the mileage vehicle

  • user (object, required): User to be linked with the mileage

    • id (number, required): Unique identifier for the user

Example:

{
  "name": "update_mileage",
  "arguments": {
    "id": 123,
    "notes": "Updated: Client meeting, project consultation, and site inspection",
    "distance": 52.3,
    "fromAddress": "Office - 123 Business St, Business City",
    "toAddress": "Client Site - 456 Client Ave, Client City (with site inspection)",
    "type": "Business",
    "user": {"id": 101}
  }
}
39. delete_mileage

Delete a mileage entry.

Parameters:

  • id (number, required): Mileage entry ID

Example:

{
  "name": "delete_mileage",
  "arguments": {
    "id": 123
  }
}
40. update_mileage_status

Update the status of mileage entries (internal approval/invoicing status).

Parameters:

  • message (string, optional): Status history message

  • mileages (array, required): List of mileage entries to be updated (maximum of 100 entries)

    • id (number, required): Unique identifier for the mileage

  • status (string, required): The internal approval/invoicing status

    • Allowed values: Open, PendingApproval, Approved, Invoiced, WrittenOff, Rejected

Example:

{
  "name": "update_mileage_status",
  "arguments": {
    "message": "Approved by manager after review",
    "mileages": [{"id": 123}, {"id": 124}],
    "status": "Approved"
  }
}
41. update_mileage_client_status

Update the client status of mileage entries (external approval/invoicing status).

Parameters:

  • clientStatus (string, required): The external approval/invoicing status (used only when client portal is enabled)

    • Allowed values: Open, PendingApproval, Approved, Invoiced, WrittenOff, Rejected

  • message (string, optional): Status history message

  • mileages (array, required): List of mileage entries to be updated (maximum of 100 entries)

    • id (number, required): Unique identifier for the mileage

Example:

{
  "name": "update_mileage_client_status",
  "arguments": {
    "clientStatus": "Approved",
    "message": "Client approved mileage claims",
    "mileages": [{"id": 123}, {"id": 124}]
  }
}
42. get_mileage_status_history

Query status history modification records of a mileage entry.

Parameters:

  • id (number, required): Mileage entry ID

  • top (number, optional): Maximum number of status history records to return (1-10000, default: 100)

  • skip (number, optional): Number of status history records to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression (e.g., "modifiedOn desc")

Example:

{
  "name": "get_mileage_status_history",
  "arguments": {
    "id": 123,
    "orderby": "modifiedOn desc",
    "top": 50
  }
}
43. get_mileage_vehicles

Retrieve all mileage vehicles from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of mileage vehicles to return (1-10000, default: 100)

  • skip (number, optional): Number of mileage vehicles to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand (e.g., "users")

  • active_only (boolean, optional): Only return active mileage vehicles (default: false)

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

Example:

{
  "name": "get_mileage_vehicles",
  "arguments": {
    "active_only": true,
    "expand": "users",
    "orderby": "brand asc"
  }
}
44. get_mileage_vehicle_by_id

Get a specific mileage vehicle by ID.

Parameters:

  • id (number, required): Mileage vehicle ID

  • expand (string, optional): Comma-delimited list of properties to expand

Example:

{
  "name": "get_mileage_vehicle_by_id",
  "arguments": {
    "id": 789,
    "expand": "users"
  }
}

Tags

45. get_tags

Retrieve all tags from TimeChimp.

Parameters:

  • top (number, optional): Maximum number of tags to return (1-10000, default: 100)

  • skip (number, optional): Number of tags to skip for pagination (default: 0)

  • count (boolean, optional): Whether to include the total count of results (default: true)

  • expand (string, optional): Comma-delimited list of properties to expand

  • active_only (boolean, optional): Only return active tags (default: false)

  • filter (string, optional): OData filter expression

  • orderby (string, optional): OData orderby expression

46. get_tag_by_id

Get a specific tag by ID.

Parameters:

  • id (number, required): Tag ID

  • expand (string, optional): Comma-delimited list of properties to expand

TimeChimp API v2 Features

Pagination

The server uses TimeChimp's standard pagination parameters:

  • $top: Maximum number of records to return (1-10000, default: 100)

  • $skip: Number of records to skip for pagination

Filtering (OData)

The server supports TimeChimp's OData filtering conventions:

  • Basic filters: name eq 'Project Name'

  • Boolean filters: active eq true

  • Date filters: date eq 2023-12-31

  • DateTime filters: start gt 2023-12-31T23:59:59Z

  • Combined filters: active eq true and name eq 'Project Name'

  • Collection filters: projects/any(project:project/id eq 123)

Sorting (OData)

The server supports OData sorting:

  • Single field: name desc

  • Multiple fields: name desc, createdAt asc

  • Nested properties: address/city asc

Expansion (OData)

The server supports expanding related entities:

  • Single expansion: customer

  • Multiple expansions: customer,projects,tasks

  • Nested expansions: customer/contacts

Count

The server supports counting total results:

  • $count=true: Include total count in response

  • $count=false: Exclude total count (default for performance)

API Endpoints

The server interacts with the following TimeChimp API v2 endpoints:

  • GET /projects - Retrieve projects

  • GET /projects/{id} - Get specific project by ID

  • POST /projects - Create new project

  • PUT /projects/{id} - Update existing project

  • DELETE /projects/{id} - Delete project

  • GET /projects/{id}/insights - Get project insights

  • GET /users - Retrieve users

  • GET /users/{id} - Get specific user by ID

  • POST /users - Create new user

  • PUT /users/{id} - Update existing user

  • GET /times - Retrieve time entries

  • GET /times/{id} - Get specific time entry by ID

  • GET /contacts - Retrieve contacts

  • GET /contacts/{id} - Get specific contact by ID

  • POST /contacts - Create new contact

  • PUT /contacts/{id} - Update existing contact

  • DELETE /contacts/{id} - Delete contact

  • GET /customers - Retrieve customers

  • GET /customers/{id} - Get specific customer by ID

  • POST /customers - Create new customer

  • PUT /customers/{id} - Update existing customer

  • DELETE /customers/{id} - Delete customer

  • GET /tasks - Retrieve tasks

  • GET /tasks/{id} - Get specific task by ID

  • GET /invoices - Retrieve invoices

  • GET /invoices/{id} - Get specific invoice by ID

  • GET /expenses - Retrieve expenses

  • GET /expenses/{id} - Get specific expense by ID

  • POST /expenses - Create new expense

  • PUT /expenses/{id} - Update existing expense

  • DELETE /expenses/{id} - Delete expense

  • PUT /expenses/status - Update expense status (internal)

  • PUT /expenses/clientStatus - Update expense client status (external)

  • GET /expenses/{id}/statusHistory - Get expense status history

  • GET /mileage - Retrieve mileage entries

  • GET /mileage/{id} - Get specific mileage entry by ID

  • POST /mileage - Create new mileage entry

  • PUT /mileage/{id} - Update existing mileage entry

  • DELETE /mileage/{id} - Delete mileage entry

  • PUT /mileage/status - Update mileage status (internal)

  • PUT /mileage/clientStatus - Update mileage client status (external)

  • GET /mileage/{id}/statusHistory - Get mileage status history

  • GET /mileageVehicles - Retrieve mileage vehicles

  • GET /mileageVehicles/{id} - Get specific mileage vehicle by ID

  • GET /tags - Retrieve tags

  • GET /tags/{id} - Get specific tag by ID

All requests are authenticated using the api-key header and support OData query parameters.

Advanced Examples

Complex Filtering

{
  "name": "get_time_entries",
  "arguments": {
    "filter": "date ge 2024-01-01 and date le 2024-01-31 and user/id eq 123 and project/active eq true",
    "expand": "user,project,task",
    "orderby": "date desc, start desc",
    "top": 50
  }
}

Pagination Example

{
  "name": "get_projects",
  "arguments": {
    "top": 25,
    "skip": 50,
    "count": true,
    "orderby": "name asc"
  }
}

Creating and Managing Contacts

// Create a contact
{
  "name": "create_contact",
  "arguments": {
    "name": "Jane Smith",
    "jobTitle": "CEO",
    "email": "jane@company.com",
    "useForInvoicing": true,
    "customers": [{"id": 123}]
  }
}

// Update the contact
{
  "name": "update_contact",
  "arguments": {
    "id": 456,
    "name": "Jane Smith-Johnson",
    "phone": "+1987654321"
  }
}

// Get contact with expanded customers
{
  "name": "get_contact_by_id",
  "arguments": {
    "id": 456,
    "expand": "customers"
  }
}

Creating and Managing Customers

// Create a customer
{
  "name": "create_customer",
  "arguments": {
    "name": "Acme Corporation",
    "email": "contact@acme.com",
    "phone": "+1234567890",
    "website": "https://acme.com",
    "address": {
      "address": "123 Business St",
      "postalCode": "12345",
      "city": "Business City",
      "country": "USA"
    },
    "paymentPeriod": 30,
    "hourlyRate": 150.00,
    "prospect": false,
    "tags": [{"id": 1}, {"id": 2}],
    "contacts": [{"id": 123}]
  }
}

// Update the customer
{
  "name": "update_customer",
  "arguments": {
    "id": 456,
    "name": "Acme Corporation Ltd",
    "email": "newcontact@acme.com",
    "paymentPeriod": 45,
    "hourlyRate": 175.00
  }
}

// Get customer with expanded contacts and tags
{
  "name": "get_customer_by_id",
  "arguments": {
    "id": 456,
    "expand": "contacts,tags"
  }
}

Creating and Managing Expenses

// Create an expense
{
  "name": "create_expense",
  "arguments": {
    "date": "2024-01-15",
    "notes": "Business lunch with client",
    "quantity": 1,
    "rate": 75.50,
    "billable": true,
    "customer": {"id": 123},
    "project": {"id": 456},
    "user": {"id": 789}
  }
}

// Update the expense
{
  "name": "update_expense",
  "arguments": {
    "id": 123,
    "notes": "Updated: Business lunch with client and partner",
    "rate": 85.00,
    "user": {"id": 789}
  }
}

// Update expense status (approve multiple expenses)
{
  "name": "update_expense_status",
  "arguments": {
    "message": "Approved by manager",
    "expenses": [{"id": 123}, {"id": 124}],
    "status": "Approved"
  }
}

// Get expense status history
{
  "name": "get_expense_status_history",
  "arguments": {
    "id": 123,
    "orderby": "modifiedOn desc"
  }
}

Creating and Managing Projects

// Create a project with comprehensive settings
{
  "name": "create_project",
  "arguments": {
    "name": "Website Redesign Project",
    "code": "WEB-2024-001",
    "notes": "Complete redesign of company website with modern UI/UX",
    "color": "#3498db",
    "startDate": "2024-01-15",
    "endDate": "2024-06-30",
    "invoicing": {
      "method": "ProjectHourlyRate",
      "hourlyRate": 125.00,
      "reference": "WEB-2024-INV"
    },
    "budget": {
      "method": "TotalHours",
      "hours": 400,
      "notificationPercentage": 80
    },
    "customer": {"id": 123},
    "managers": [{"id": 456}],
    "tags": [{"id": 1}, {"id": 2}],
    "projectTasks": [
      {
        "active": true,
        "billable": true,
        "hourlyRate": 125.00,
        "budgetHours": 100,
        "task": {"id": 789}
      },
      {
        "active": true,
        "billable": true,
        "hourlyRate": 150.00,
        "budgetHours": 80,
        "task": {"id": 790}
      }
    ],
    "projectUsers": [
      {
        "active": true,
        "hourlyRate": 125.00,
        "budgetHours": 200,
        "costHourlyRate": 80.00,
        "user": {"id": 101}
      },
      {
        "active": true,
        "hourlyRate": 150.00,
        "budgetHours": 200,
        "costHourlyRate": 100.00,
        "user": {"id": 102}
      }
    ]
  }
}

// Update the project with new requirements
{
  "name": "update_project",
  "arguments": {
    "id": 123,
    "name": "Website Redesign Project - Phase 2",
    "endDate": "2024-08-31",
    "invoicing": {
      "method": "ProjectHourlyRate",
      "hourlyRate": 150.00
    },
    "budget": {
      "method": "TotalHours",
      "hours": 600,
      "notificationPercentage": 85
    },
    "projectTasks": [
      {
        "id": 456,
        "active": true,
        "billable": true,
        "hourlyRate": 150.00,
        "budgetHours": 120,
        "task": {"id": 789}
      }
    ],
    "projectUsers": [
      {
        "id": 789,
        "active": true,
        "hourlyRate": 150.00,
        "budgetHours": 300,
        "costHourlyRate": 90.00,
        "user": {"id": 101}
      }
    ]
  }
}

// Get project insights for performance analysis
{
  "name": "get_project_insights",
  "arguments": {
    "id": 123
  }
}

// Get project with expanded relationships
{
  "name": "get_project_by_id",
  "arguments": {
    "id": 123,
    "expand": "customer,managers,tags,projectTasks,projectUsers"
  }
}

Creating and Managing Users

// Create a user with contract and role assignment
{
  "name": "create_user",
  "arguments": {
    "userName": "john.doe@company.com",
    "displayName": "John Doe",
    "language": "en",
    "role": {"id": 2},
    "sendInvitation": true,
    "contracts": [
      {
        "startDate": "2024-01-15",
        "endDate": "2024-12-31",
        "weekHours": 40,
        "hourlyRate": 75.00,
        "costHourlyRate": 50.00,
        "contractNumber": "EMP-2024-001",
        "contractType": {"id": 1}
      }
    ]
  }
}

// Update the user with new role and contract terms
{
  "name": "update_user",
  "arguments": {
    "id": 123,
    "displayName": "John Doe - Senior Developer",
    "language": "en",
    "employeeNumber": "EMP-001",
    "badgeNumber": "BADGE-001",
    "citizenServiceNumber": "123456789",
    "role": {"id": 3},
    "tags": [{"id": 1}, {"id": 2}],
    "contracts": [
      {
        "id": 456,
        "startDate": "2024-01-15",
        "endDate": "2024-12-31",
        "weekHours": 40,
        "hourlyRate": 85.00,
        "costHourlyRate": 55.00,
        "contractNumber": "EMP-2024-001-UPD",
        "contractType": {"id": 1}
      }
    ]
  }
}

// Get user with expanded relationships
{
  "name": "get_user_by_id",
  "arguments": {
    "id": 123,
    "expand": "role,team,tags,contracts,selfBilling,customSchedule"
  }
}

// Get users with filtering and expansion
{
  "name": "get_users",
  "arguments": {
    "filter": "active eq true and role/name eq 'Developer'",
    "expand": "role,contracts",
    "orderby": "displayName asc",
    "top": 50
  }
}

Creating and Managing Mileage

// Create a mileage entry
{
  "name": "create_mileage",
  "arguments": {
    "date": "2024-01-15",
    "fromAddress": "Office - 123 Business St, Business City",
    "toAddress": "Client Site - 456 Client Ave, Client City",
    "notes": "Client meeting and project consultation",
    "distance": 45.5,
    "billable": true,
    "type": "Business",
    "customer": {"id": 123},
    "project": {"id": 456},
    "vehicle": {"id": 789},
    "user": {"id": 101}
  }
}

// Update the mileage entry
{
  "name": "update_mileage",
  "arguments": {
    "id": 123,
    "notes": "Updated: Client meeting, project consultation, and site inspection",
    "distance": 52.3,
    "fromAddress": "Office - 123 Business St, Business City",
    "toAddress": "Client Site - 456 Client Ave, Client City (with site inspection)",
    "type": "Business",
    "user": {"id": 101}
  }
}

// Update mileage status (approve multiple mileage entries)
{
  "name": "update_mileage_status",
  "arguments": {
    "message": "Approved by manager after review",
    "mileages": [{"id": 123}, {"id": 124}],
    "status": "Approved"
  }
}

// Update mileage client status
{
  "name": "update_mileage_client_status",
  "arguments": {
    "clientStatus": "Approved",
    "message": "Client approved mileage claims",
    "mileages": [{"id": 123}, {"id": 124}]
  }
}

// Get mileage status history
{
  "name": "get_mileage_status_history",
  "arguments": {
    "id": 123,
    "orderby": "modifiedOn desc"
  }
}

// Get mileage entries with filtering
{
  "name": "get_mileage",
  "arguments": {
    "user_id": "101",
    "from_date": "2024-01-01",
    "to_date": "2024-01-31",
    "filter": "type eq 'Business' and billable eq true",
    "expand": "user,project,customer,vehicle",
    "orderby": "date desc"
  }
}

// Get mileage vehicles
{
  "name": "get_mileage_vehicles",
  "arguments": {
    "active_only": true,
    "expand": "users",
    "orderby": "brand asc"
  }
}

// Get specific mileage vehicle with users
{
  "name": "get_mileage_vehicle_by_id",
  "arguments": {
    "id": 789,
    "expand": "users"
  }
}

Error Handling

The server includes comprehensive error handling:

  • Authentication errors: When API key is missing or invalid

  • API errors: When TimeChimp API returns error responses (including 429 rate limiting)

  • Network errors: When requests fail due to connectivity issues

  • Validation errors: When invalid parameters are provided

  • OData errors: When invalid filter or orderby expressions are used

Error responses include detailed error messages to help with debugging.

Development

Project Structure

TimeJS/
├── timechimp-mcp-server.js    # Main server file
├── package.json               # Node.js dependencies and scripts
└── README.md                  # This file

Adding New Tools

To add new tools:

  1. Add the tool definition to the ListToolsRequestSchema handler

  2. Add a case for the tool in the CallToolRequestSchema handler

  3. Implement the tool method in the TimechimpMCPServer class

  4. Use the generic handleGetRequest or handleGetByIdRequest methods for consistency

Testing

You can test the server using any MCP client or by running it directly and sending JSON-RPC messages via stdin.

Troubleshooting

Common Issues

  1. "TIMECHIMP_API_KEY environment variable is required"

    • Make sure you've set the TIMECHIMP_API_KEY environment variable

    • Verify the API key is correct and has proper permissions

  2. "TimeChimp API error: 401 Unauthorized"

    • Check that your API key is valid and not expired

    • Ensure your TimeChimp account has API access enabled

  3. "TimeChimp API error: 404 Not Found"

    • The API endpoint might not exist or the URL might be incorrect

    • Check if you're using the correct TimeChimp API v2 base URL

  4. "TimeChimp API error: 429 Too Many Requests"

    • You've exceeded the rate limit (100 requests per minute per company)

    • Wait for the rate limit to reset or implement request throttling

  5. OData filter errors

    • Verify your filter syntax follows OData conventions

    • Check that field names are correct and properly escaped

    • Use single quotes for string values: name eq 'Project Name'

  6. Network connection errors

    • Verify your internet connection

    • Check if there are any firewall restrictions

Debug Mode

Run the server in debug mode to get more detailed logging:

npm run dev

Contributing

  1. Fork the repository

  2. Create a feature branch

  3. Make your changes

  4. Test thoroughly

  5. Submit a pull request

License

This project is licensed under the MIT License - see the LICENSE file for details.

Support

For issues related to:

  • This MCP server: Open an issue in this repository

  • TimeChimp API: Contact TimeChimp support at ict@timechimp.com

  • MCP protocol: Check the Model Context Protocol documentation

Changelog

v0.7.0

  • Added full CRUD operations for mileage (Create, Read, Update, Delete)

  • Added mileage status management with internal and external status updates

  • Added mileage status history tracking functionality

  • Added mileage vehicle management (Read operations)

  • Enhanced mileage management with comprehensive linking to customers, projects, vehicles, and users

  • Added bulk status update capabilities for mileage (up to 100 entries at once)

  • Updated tool count to 46 total tools

  • Added mileage CRUD examples to documentation

v0.6.0

  • Added full CRUD operations for users (Create, Read, Update, Delete)

  • Added user contract management and role assignment

  • Updated tool count to 38 total tools

  • Added user CRUD examples to documentation

v0.5.0

  • Added full CRUD operations for projects (Create, Read, Update, Delete)

  • Added project insights functionality

  • Updated tool count to 36 total tools

  • Added project CRUD examples to documentation

v0.4.0

  • Added full CRUD operations for expenses (Create, Read, Update, Delete)

  • Added expense status management with internal and external status updates

  • Added expense status history tracking functionality

  • Enhanced expense management with comprehensive linking to customers, projects, products, users, and VAT rates

  • Added bulk status update capabilities (up to 100 expenses at once)

  • Updated tool count to 32 total tools

  • Added expense CRUD examples to documentation

v0.3.0

  • Added full CRUD operations for customers (Create, Read, Update, Delete)

  • Added comprehensive customer management with address, payment terms, rates, and relationships

  • Enhanced customer tools with support for VAT rates, tags, and contact linking

  • Updated tool count to 26 total tools

  • Added customer CRUD examples to documentation

v0.2.0

  • Added comprehensive support for all major TimeChimp API v2 endpoints

  • Added full CRUD operations for contacts (Create, Read, Update, Delete)

  • Added support for customers, tasks, invoices, expenses, mileage, and tags

  • Added generic request handlers for consistency and maintainability

  • Enhanced OData support with $expand, $count, and improved filtering

  • Added individual "get by ID" tools for all resource types

  • Improved error handling and validation

  • Updated API version header to 2.0

v0.1.0

  • Initial release

  • Support for GetProjects, Users, and TimeEntries tools

  • TimeChimp API v2 integration with OData support

  • Comprehensive error handling and validation

  • Default sorting for projects (most recent first)

Available Tools

46 tools
create_contactC

Create a new contact

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe contact name
jobTitleNoThe contact job title
emailNoThe contact email address
phoneNoThe contact phone number
useForInvoicingNoWhether the contact info will be used for invoicing (default: false)
activeNoWhether the contact can be used (default: true)
customersNoList of customer IDs to link to this contact

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. 'Create a new contact' implies a write/mutation operation, but there's no information about permissions required, whether the operation is idempotent, what happens on duplicate data, what the response contains, or any error conditions. For a creation tool with zero annotation coverage, this is inadequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is maximally concise - a single three-word phrase that communicates the core function without any wasted words. It's appropriately sized for such a basic operation and gets straight to the point.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a creation tool with 7 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain what a 'contact' represents in this system, what happens after creation, whether there are validation rules, or how this entity relates to others in the system (like customers or users). The context signals indicate significant complexity that the description doesn't address.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides no parameter information beyond what's already in the schema. However, with 100% schema description coverage, all 7 parameters are well-documented in the schema itself. The baseline score of 3 reflects that the schema does the heavy lifting, though the description adds no additional context about parameter relationships or usage patterns.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Create a new contact' clearly states the verb and resource, making the basic purpose understandable. However, it doesn't differentiate this tool from sibling tools like 'create_customer' or 'create_user' - all appear to create different entity types, but the description provides no context about what distinguishes a 'contact' from these other entities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. With sibling tools like 'create_customer', 'create_user', and 'update_contact' available, there's no indication of when a contact should be created versus these other entities, or when to create versus update an existing contact.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_customerC

Create a new customer

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe customer name
activeNoWhether the customer can be used (default: true)
relationIdNoThe customer number
addressNoThe customer address info
phoneNoThe customer phone number
emailNoThe customer email address
websiteNoThe customer website URL
paymentPeriodNoThe customer payment term in days
hourlyRateNoThe customer default hourly price
mileageRateNoThe customer default mileage price, per KM
ibanNoThe customer IBAN
bicNoThe customer BIC
vatNumberNoThe customer VAT number
kvkNumberNoThe customer business ID
invoiceAddressNoThe customer invoice address info, override of the customer address info
notesNoThe customer notes
prospectNoThe customer is a prospect
vatRateNoVat rate to be used for this customer
tagsNoList of tag IDs to link to this customer
contactsNoList of contact IDs to link to this customer

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. While 'create' implies a write operation, the description doesn't mention required permissions, whether the operation is idempotent, what happens on duplicate data, or what the response contains. For a mutation tool with 20 parameters, this leaves significant behavioral questions unanswered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at just three words, with zero wasted language. It's front-loaded with the essential information (create operation on customer resource) and contains no unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with 20 parameters, nested objects, no annotations, and no output schema, the description is severely inadequate. It doesn't explain what happens after creation, what identifiers are returned, error conditions, or how this fits into the broader customer management system alongside sibling tools.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so all parameters are documented in the schema itself. The description adds no additional parameter information beyond what's already in the schema descriptions. This meets the baseline expectation when schema coverage is complete, but provides no extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('create') and resource ('customer'), making the purpose immediately understandable. However, it doesn't differentiate this tool from its sibling 'update_customer' or explain how it differs from other creation tools like 'create_contact' or 'create_project' in the same system.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance about when to use this tool versus alternatives. There's no mention of prerequisites, when creation is appropriate versus updating existing customers, or how this relates to sibling tools like 'get_customers' or 'delete_customer' in typical workflows.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_expenseC

Create a new expense

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoThe expense date (YYYY-MM-DD format, default: UTC today)
notesNoThe expense notes
quantityNoThe expense quantity (default: 1)
rateYesThe expense rate/price
billableNoWhether the expense can be invoiced (default: true)
customerNoCustomer to be linked with the expense
projectNoProject to be linked with the expense
productNoProduct to be linked with the expense
userYesUser to be linked with the expense
vatRateNoVAT rate to be linked with the expense (default: highest percentage)

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Create a new expense' implies a write/mutation operation, but it doesn't disclose critical traits such as authentication needs, rate limits, whether the creation is idempotent, what happens on failure, or the expected response format. For a mutation tool with zero annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence—'Create a new expense'—with zero wasted words. It's front-loaded and appropriately sized for its purpose, though it could benefit from more detail. Every word earns its place by stating the core action clearly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (10 parameters, nested objects, no output schema, and no annotations), the description is incomplete. It doesn't explain what an 'expense' entails in this system, how it relates to other resources (e.g., customers, projects), or what the tool returns upon success. For a mutation tool with rich input schema but no output or behavioral hints, more context is needed to guide effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, meaning all parameters are documented in the input schema with descriptions (e.g., 'date' as 'YYYY-MM-DD format', 'rate' as 'expense rate/price'). The description adds no additional parameter semantics beyond this, so it meets the baseline of 3 where the schema does the heavy lifting, but doesn't compensate with extra context like examples or usage tips.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Create a new expense' clearly states the verb ('Create') and resource ('expense'), which is adequate. However, it doesn't differentiate this tool from sibling tools like 'create_mileage' or 'create_project' that also create different resource types, nor does it specify what constitutes an 'expense' in this system (e.g., a billable cost vs. mileage). This makes it vague compared to more specific alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. For example, it doesn't mention when to choose 'create_expense' over 'create_mileage' (likely for different expense types) or 'create_project' (for project creation), nor does it indicate prerequisites like required permissions or dependencies. This lack of context leaves the agent to infer usage from tool names alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_mileageC

Create a new mileage entry

ParametersJSON Schema
NameRequiredDescriptionDefault
dateNoThe mileage date (YYYY-MM-DD format, default: UTC today)
fromAddressNoThe mileage from address
toAddressNoThe mileage to address
notesNoThe mileage notes
distanceYesThe mileage distance in KM
billableNoWhether the mileage can be invoiced (default: true)
typeYesThe mileage type
customerNoCustomer to be linked with the mileage
projectNoProject to be linked with the mileage
vehicleNoVehicle to be linked with the mileage
userYesUser to be linked with the mileage

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden for behavioral disclosure. 'Create a new mileage entry' implies a write/mutation operation but provides no information about permissions required, whether the operation is idempotent, what happens on failure, or what the response contains. For a creation tool with 11 parameters and no output schema, this minimal description leaves critical behavioral aspects unspecified.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at just four words, front-loading the essential information with zero wasted words. It follows the pattern of other sibling tools (e.g., 'create_contact', 'create_expense') consistently. For such a straightforward creation operation, this brevity is appropriate rather than under-specified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (11 parameters including nested objects, 3 required parameters, no output schema, and no annotations), the description is insufficiently complete. It doesn't explain what a 'mileage entry' represents in the system's domain, doesn't mention typical use cases, and provides no information about the creation result. The 100% schema coverage helps but doesn't compensate for the lack of contextual understanding needed for proper tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are documented in the schema itself. The description adds no parameter information beyond what's already in the structured schema - it doesn't explain relationships between parameters, provide examples, or clarify dependencies. The baseline score of 3 reflects adequate coverage through the schema alone, though the description contributes nothing additional.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('create') and resource ('mileage entry'), making the purpose immediately understandable. It distinguishes this from sibling tools like 'update_mileage' or 'get_mileage' by specifying it creates a new entry rather than modifying or retrieving existing ones. However, it doesn't explicitly differentiate from other creation tools like 'create_expense' or 'create_project' beyond the resource type.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (like needing existing customer/project/vehicle/user IDs), doesn't explain when mileage creation is appropriate versus expense creation, and offers no context about typical workflows. With multiple sibling creation tools available, this lack of differentiation is a significant gap.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_projectC

Create a new project

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesThe project name
activeNoWhether the project can be used (default: true)
codeNoThe project code
notesNoThe project description
colorNoThe project color
startDateNoThe project start date (YYYY-MM-DD format)
endDateNoThe project end date (YYYY-MM-DD format)
invoicingNoThe project invoicing settings
budgetNoThe project budget settings
customerNoCustomer to be linked with the project
mainProjectNoMain project to be linked with the project (if it is a subproject)
subprojectsNoList of subprojects to be linked to the project (if it is a main project)
managersNoList of managers to be linked to the project
tagsNoList of tags to be linked to the project
projectTasksYesList of project tasks to be linked to the project (if no tasks are specified, active common tasks will be prefilled)
projectUsersYesList of project users to be linked to the project (if no users are specified, active users will be prefilled)

TDQS

C2/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure but offers none. 'Create a new project' implies a write/mutation operation but doesn't disclose permissions needed, whether creation is idempotent, what happens on failure, rate limits, or any side effects. This is inadequate for a complex creation tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at just three words. While this represents severe under-specification, it's not verbose or poorly structured—every word directly states the tool's action. The problem is insufficiency, not lack of conciseness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex creation tool with 16 parameters, nested objects, no annotations, and no output schema, the description is completely inadequate. It doesn't explain what a successful creation returns, error conditions, or the operational context. The agent lacks essential information to use this tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 16 parameters. The description adds no parameter information beyond what's in the schema, meeting the baseline score of 3. However, it doesn't compensate for the schema's complexity by explaining relationships between parameters (e.g., how invoicing.method affects other fields).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Create a new project' is a tautology that restates the tool name without adding specificity. It doesn't distinguish this tool from sibling creation tools (e.g., create_contact, create_customer) beyond the resource type, and lacks details about what constitutes a 'project' in this context.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. There's no mention of prerequisites, when not to use it, or how it relates to sibling tools like update_project or delete_project. The agent receives zero contextual usage information.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_userA

Create a new user (note: adding users can result in additional invoice and extra cost)

ParametersJSON Schema
NameRequiredDescriptionDefault
userNameYesThe user email address
displayNameYesThe user name
languageNoThe user language (default: en)
roleNoRole to be assigned to the user (default: User)
sendInvitationNoWhether an invitation should be sent to the user (default: false)
contractsNoList of user contracts to be linked

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It adds valuable context about financial implications ('can result in additional invoice and extra cost'), which is crucial for a creation tool. However, it doesn't mention permission requirements, rate limits, or what the response looks like.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core purpose. The parenthetical note about costs is relevant and earns its place. No wasted words, though it could potentially be more structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a creation tool with no annotations and no output schema, the description is adequate but has clear gaps. It covers the purpose and a key behavioral implication (costs), but doesn't address permissions, response format, or error conditions. The 100% schema coverage helps, but more behavioral context would be beneficial.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 6 parameters thoroughly. The description doesn't add any parameter-specific information beyond what's in the schema. Baseline 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Create a new user' specifies the verb and resource. It distinguishes from sibling tools like create_contact or create_customer by focusing on users. However, it doesn't explicitly differentiate from update_user or get_user_by_id in terms of when to use each.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides implied usage guidance through the note about additional costs, suggesting this should be used cautiously. However, it doesn't explicitly state when to use this vs. alternatives like update_user or get_users, nor does it mention prerequisites or exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_contactC

Delete a contact

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContact ID

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Delete a contact' implies a destructive, irreversible mutation, but it fails to specify critical details: whether it requires specific permissions, what happens to associated data, if deletion is permanent, or what the response looks like (e.g., success/failure confirmation). For a destructive tool with zero annotation coverage, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence with zero wasted words—'Delete a contact' is front-loaded and efficiently conveys the core action. Every word earns its place, making it easy for an agent to parse quickly without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given this is a destructive mutation tool with no annotations and no output schema, the description is incomplete. It lacks essential context: behavioral risks (e.g., irreversibility), permission requirements, error handling, or output expectations. The 100% schema coverage helps with parameters, but overall completeness is inadequate for safe and effective use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage (the 'id' parameter is documented as 'Contact ID'), so the schema does the heavy lifting. The description adds no additional meaning about parameters beyond implying deletion requires an ID. This meets the baseline of 3 for high schema coverage, but doesn't enhance understanding (e.g., format constraints or examples).

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Delete a contact' clearly states the action (delete) and resource (contact), making the purpose immediately understandable. It distinguishes from sibling tools like 'get_contact_by_id' or 'update_contact' by specifying the destructive operation. However, it doesn't explicitly differentiate from other delete operations (e.g., 'delete_customer'), which slightly reduces specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a contact ID), exclusions (e.g., irreversible nature), or comparisons to other tools like 'update_contact' for modifications. This leaves the agent with minimal context for decision-making.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_customerC

Delete a customer

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCustomer ID

TDQS

C2/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. 'Delete a customer' implies a destructive, irreversible mutation, but the description fails to disclose critical behavioral traits: whether deletion is permanent or soft, what permissions are required, whether related data is cascaded, what happens on success/failure, or any rate limits. This is dangerously inadequate for a destructive operation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is maximally concise at three words with zero wasted language. It's front-loaded with the core action and resource. While severely under-specified, what's present earns its place efficiently without redundancy or fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness1/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive mutation tool with no annotations and no output schema, the description is completely inadequate. It fails to address critical context: what 'delete' means operationally, what permissions are needed, what the response contains, error conditions, or relationships to sibling tools. The agent cannot safely or effectively use this tool based on this description alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% (the 'id' parameter is fully documented in the schema as 'Customer ID'), so the baseline score is 3. The description adds no parameter information beyond what's already in the schema—it doesn't explain format constraints, validation rules, or provide examples. It meets the minimum viable threshold but adds zero value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Delete a customer' is a tautology that merely restates the tool name. While it identifies the verb ('Delete') and resource ('customer'), it provides no additional specificity about scope, permanence, or what constitutes a 'customer' in this context. It doesn't differentiate from sibling delete tools like delete_contact or delete_project beyond the resource name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines1/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides absolutely no guidance about when to use this tool versus alternatives. There's no mention of prerequisites (e.g., customer must exist), consequences, or when to choose this over other customer-related tools like update_customer or get_customer_by_id. The agent receives zero contextual direction.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_expenseC

Delete an expense

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExpense ID

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Delete an expense' implies a destructive mutation, but it doesn't specify whether deletion is permanent, reversible, requires specific permissions, or has side effects (e.g., affecting related records). This is a significant gap for a destructive tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise with a single sentence 'Delete an expense', which is front-loaded and wastes no words. Every part of the sentence directly contributes to the tool's purpose, making it efficient and well-structured for its brevity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (destructive mutation with no annotations and no output schema), the description is incomplete. It lacks critical information such as behavioral traits (e.g., permanence, permissions), usage context, or output expectations. This makes it inadequate for safe and effective use by an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 1 parameter with 100% description coverage ('Expense ID'), so the schema fully documents the parameter. The description adds no additional parameter information, but with 0 parameters needing semantic clarification beyond the schema, a baseline of 4 is appropriate as it doesn't detract from the schema's completeness.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Delete an expense' states the action (delete) and resource (expense), which is clear but minimal. It distinguishes from sibling tools like 'delete_contact' or 'delete_project' by specifying the expense resource, but lacks specificity about scope or permanence. It's not tautological but remains vague about what 'delete' entails.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. For example, it doesn't mention prerequisites (e.g., needing an expense ID from 'get_expense_by_id'), exclusions, or comparisons to other deletion tools like 'delete_contact'. The description offers no context for usage decisions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_mileageC

Delete a mileage entry

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMileage entry ID

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the tool deletes a mileage entry, implying a destructive operation, but lacks details on permissions required, whether deletion is reversible, side effects (e.g., impact on related records), or error handling. This is insufficient for a mutation tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, direct sentence with zero wasted words, front-loading the key action and resource. It efficiently communicates the core purpose without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a destructive tool with no annotations and no output schema, the description is incomplete. It lacks critical context such as behavioral traits (e.g., permanence, authorization), usage guidelines, and expected outcomes, leaving significant gaps for an AI agent to operate safely and effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with the parameter 'id' clearly documented as 'Mileage entry ID'. The description doesn't add any semantic details beyond what the schema provides, such as format examples or constraints. Baseline 3 is appropriate since the schema adequately covers the single parameter.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Delete') and resource ('a mileage entry'), making the purpose immediately understandable. It distinguishes itself from sibling tools like 'create_mileage' and 'update_mileage' by specifying deletion, though it doesn't explicitly mention what distinguishes it from other delete operations (e.g., 'delete_contact').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing mileage entry ID), exclusions, or comparisons to related tools like 'update_mileage_status' for status changes instead of deletion.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

delete_projectC

Delete a project

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesProject ID

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. 'Delete a project' implies a destructive mutation, but it doesn't disclose critical behavioral traits: whether deletion is permanent or reversible, required permissions, side effects (e.g., cascading deletion of related data), error conditions, or confirmation prompts. This is a significant gap for a destructive tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise ('Delete a project')—a single phrase with zero wasted words. It's front-loaded with the core action, making it easy to scan. Every word earns its place by conveying the essential purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (destructive operation with no annotations and no output schema), the description is incomplete. It lacks details on behavioral aspects (e.g., irreversibility, permissions), usage context, and expected outcomes. For a delete tool, this minimal description leaves critical gaps for an AI agent to operate safely and effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 1 parameter with 100% description coverage ('Project ID'), so the schema fully documents the parameter. The description doesn't add any parameter details beyond the schema, but with 0 parameters to explain and high schema coverage, the baseline is 4 as it doesn't need to compensate for gaps.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Delete a project' clearly states the action (delete) and resource (project), which is adequate. However, it doesn't distinguish this tool from other delete_* siblings (e.g., delete_contact, delete_customer) beyond the resource name, and it lacks specificity about what 'delete' entails (e.g., permanent removal vs. archiving).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. For example, it doesn't mention prerequisites (e.g., ensure the project exists via get_project_by_id first), exclusions (e.g., cannot delete if active tasks exist), or comparisons to siblings like update_project for modifications. The description only states the action without context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contact_by_idC

Get a specific contact by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContact ID
expandNoComma-delimited list of properties to expand

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure but offers minimal information. It states the tool retrieves data ('Get'), implying a read operation, but doesn't specify whether it requires authentication, has rate limits, returns structured data, or handles errors like invalid IDs. For a tool with zero annotation coverage, this leaves significant behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's front-loaded with the core functionality and wastes no space on redundant details, making it easy to parse quickly while conveying essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description is insufficient for a tool that retrieves data. It doesn't explain what data is returned, format of the response, error handling, or authentication requirements. While the schema covers inputs well, the overall context for proper tool invocation remains incomplete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no parameter-specific information beyond what's already in the schema, which has 100% coverage with clear descriptions for both 'id' and 'expand'. The baseline score of 3 reflects adequate documentation through the schema alone, though the description doesn't enhance understanding of parameter usage or provide examples.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and resource ('a specific contact by ID'), making the purpose immediately understandable. It distinguishes from sibling tools like 'get_contacts' by specifying retrieval of a single contact rather than a list. However, it doesn't explicitly differentiate from other 'get_by_id' tools for different resources, which prevents a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to choose 'get_contact_by_id' over 'get_contacts' for multiple contacts, or how it relates to sibling tools like 'update_contact' or 'delete_contact'. There's also no indication of prerequisites or error conditions, leaving usage context entirely implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_contactsC

Retrieve all contacts from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of contacts to return (1-10000, default: 100)
skipNoNumber of contacts to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand (e.g., "customers")
active_onlyNoOnly return active contacts (default: false)
filterNoOData filter expression (e.g., "name eq 'John Doe'" or "active eq true")
orderbyNoOData orderby expression (e.g., "name asc" or "created desc")

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but only states the basic retrieval action. It doesn't disclose important behavioral traits like whether this is a read-only operation, potential rate limits, authentication requirements, pagination behavior beyond what's in parameters, or what format the contacts are returned in. The description adds minimal value beyond the tool name.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise - a single sentence with no wasted words. It's front-loaded with the core purpose and doesn't contain any unnecessary elaboration or repetition. This is an example of efficient communication.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters, no annotations, and no output schema, the description is insufficiently complete. It doesn't help the agent understand what data is returned, how to interpret results, or provide context about the TimeChimp contact system. The agent would need to rely heavily on the parameter schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so all parameters are well-documented in the schema itself. The description adds no additional parameter information beyond what's already in the comprehensive schema descriptions. This meets the baseline expectation when schema coverage is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the basic action ('Retrieve all contacts') and resource ('from TimeChimp'), but it's vague about scope and doesn't differentiate from sibling tools like get_contact_by_id. It doesn't specify whether 'all' means literally every contact or if there are limitations like only returning active contacts by default.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided about when to use this tool versus alternatives like get_contact_by_id or get_customers. The description doesn't mention any prerequisites, context for usage, or exclusions that would help an agent choose appropriately among the many sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_customer_by_idC

Get a specific customer by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCustomer ID
expandNoComma-delimited list of properties to expand

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states this is a read operation ('Get'), but doesn't describe what happens on failure (e.g., if ID doesn't exist), whether authentication is required, rate limits, or what the return format looks like. For a tool with zero annotation coverage, this leaves significant behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is perfectly concise - a single sentence that states exactly what the tool does with zero wasted words. It's front-loaded with the core functionality and doesn't include any unnecessary information or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read operation with no annotations and no output schema, the description is insufficiently complete. It doesn't describe the return format, error conditions, authentication requirements, or how it differs from similar tools. Given the complexity of having 2 parameters and being part of a large sibling toolset, more contextual information would be helpful for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents both parameters (id and expand). The description adds no additional parameter information beyond what's in the schema - it doesn't explain what 'expand' does, provide examples, or clarify ID format. Baseline 3 is appropriate when the schema does all the parameter documentation work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get') and resource ('a specific customer by ID'), making the purpose immediately understandable. It distinguishes from sibling tools like 'get_customers' (plural) by specifying retrieval of a single customer. However, it doesn't explicitly differentiate from 'get_contact_by_id' or other entity-specific getters, which keeps it from a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention when to use 'get_customer_by_id' instead of 'get_customers' (for bulk retrieval) or other entity-specific getters like 'get_contact_by_id'. There's also no information about prerequisites, error conditions, or performance considerations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_customersC

Retrieve all customers from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of customers to return (1-10000, default: 100)
skipNoNumber of customers to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand (e.g., "contacts,projects")
active_onlyNoOnly return active customers (default: false)
filterNoOData filter expression (e.g., "name eq 'Company Name'" or "active eq true")
orderbyNoOData orderby expression (e.g., "name asc" or "created desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. While 'Retrieve' implies a read operation, the description doesn't mention pagination behavior (implied by 'top' and 'skip' parameters), rate limits, authentication requirements, or what format the results will be in. This is inadequate for a tool with 7 parameters and no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that states the core purpose without any wasted words. It's appropriately sized and front-loaded with the essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, no output schema, and no annotations), the description is insufficient. It doesn't explain the return format, pagination behavior, or how to interpret the various filtering options. For a list retrieval tool with multiple parameters, more context is needed for the agent to use it effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all 7 parameters well-documented in the schema itself. The description adds no additional parameter information beyond what's already in the schema, so it meets the baseline of 3 for adequate but not additive documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Retrieve') and resource ('all customers from TimeChimp'), making the purpose immediately understandable. However, it doesn't differentiate this tool from sibling tools like 'get_customer_by_id' or 'get_contacts', which would require more specificity for a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. With sibling tools like 'get_customer_by_id' for retrieving specific customers and 'get_contacts' for retrieving contacts, the agent receives no help in choosing between these related retrieval operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_expense_by_idC

Get a specific expense by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExpense ID
expandNoComma-delimited list of properties to expand

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It states it's a read operation ('Get'), but doesn't mention authentication requirements, rate limits, error handling, or what happens if the ID doesn't exist. For a tool with zero annotation coverage, this leaves significant behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at just 5 words, front-loaded with the core purpose, and contains no unnecessary information. Every word earns its place in communicating the essential function.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read operation with no annotations and no output schema, the description is insufficient. It doesn't explain what expense data is returned, format of response, error conditions, or authentication requirements. Given the context of sibling tools that include status history and other detailed operations, this description leaves too many gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents both parameters. The description doesn't add any parameter semantics beyond what's in the schema - it mentions 'by ID' which corresponds to the 'id' parameter but provides no additional context about ID format, validation, or the 'expand' parameter's purpose.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Get' and resource 'expense by ID', making the purpose unambiguous. It distinguishes from sibling 'get_expenses' by specifying retrieval of a single expense rather than a list. However, it doesn't mention what specific expense data is retrieved beyond the ID.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like 'get_expenses' or other get_by_id tools. The description implies usage when you have a specific expense ID, but doesn't address scenarios like batch retrieval or filtering by other criteria.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_expensesC

Retrieve all expenses from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of expenses to return (1-10000, default: 100)
skipNoNumber of expenses to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand (e.g., "user,project,customer")
user_idNoFilter by specific user ID
project_idNoFilter by specific project ID
customer_idNoFilter by specific customer ID
from_dateNoStart date for filtering (YYYY-MM-DD format)
to_dateNoEnd date for filtering (YYYY-MM-DD format)
filterNoOData filter expression (e.g., "amount gt 100" or "approved eq true")
orderbyNoOData orderby expression (e.g., "date desc" or "amount desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure but offers minimal information. It states 'Retrieve all expenses' but doesn't mention pagination behavior (implied by skip/top parameters), authentication requirements, rate limits, error conditions, or what format the expenses are returned in. For a tool with 11 parameters and no annotations, this leaves significant behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at just 5 words, front-loading the core purpose with zero wasted words. Every word earns its place, making it easy for an agent to quickly understand the basic function before examining the detailed schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 11 parameters, no annotations, and no output schema, the description is insufficiently complete. It doesn't explain the filtering capabilities, pagination approach, or return format. While the schema covers parameter details, the description fails to provide the contextual understanding needed to effectively use this tool, especially given the complexity implied by the many filtering options.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides no parameter information, but the schema has 100% description coverage with detailed documentation for all 11 parameters including defaults, formats, and examples. Since schema_description_coverage is high (>80%), the baseline score of 3 is appropriate - the schema does the heavy lifting, and the description adds no additional parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Retrieve') and resource ('all expenses from TimeChimp'), making the purpose immediately understandable. However, it doesn't differentiate this tool from its sibling 'get_expense_by_id' which retrieves a specific expense, nor does it mention the filtering capabilities that distinguish it from a simple list-all operation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention that this is for listing expenses with optional filtering versus 'get_expense_by_id' for retrieving a single expense, nor does it provide context about when filtering parameters should be used. The agent receives no usage direction beyond the basic purpose.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_expense_status_historyC

Query status history modification records of an expense

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExpense ID
topNoMaximum number of status history records to return (1-10000, default: 100)
skipNoNumber of status history records to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand
filterNoOData filter expression
orderbyNoOData orderby expression (e.g., "modifiedOn desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states 'query,' implying a read-only operation, but doesn't confirm this or describe other traits like rate limits, authentication needs, error handling, or response format. The description adds minimal behavioral context beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero waste. It's front-loaded with the core purpose and appropriately sized for the tool's complexity. Every word earns its place without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, no output schema, no annotations), the description is incomplete. It lacks details on behavioral traits, usage context, and output format (e.g., what data is returned, pagination behavior). For a query tool with multiple parameters and no structured output documentation, more context is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 7 parameters (e.g., 'id' for expense ID, 'top' for max records). The description adds no additional parameter semantics beyond what's in the schema, such as explaining relationships between parameters (e.g., 'skip' and 'top' for pagination). Baseline 3 is appropriate when schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Query status history modification records of an expense.' It specifies the action ('query'), resource ('status history modification records'), and target ('an expense'). However, it doesn't explicitly differentiate from sibling tools like 'get_expense_by_id' or 'get_expenses,' which focus on expense data rather than status history.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an expense ID), exclusions, or comparisons to similar tools like 'get_mileage_status_history' for mileage records. Usage is implied but not explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_invoice_by_idC

Get a specific invoice by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesInvoice ID
expandNoComma-delimited list of properties to expand

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It states it's a 'Get' operation, implying read-only, but doesn't disclose behavioral traits like authentication needs, rate limits, error handling, or what happens if the ID doesn't exist. The description is minimal and lacks context beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with zero waste. It's front-loaded with the core action and efficiently conveys the tool's purpose without unnecessary details, making it easy to scan and understand quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description is incomplete for a tool with 2 parameters. It doesn't explain return values, error cases, or behavioral context. For a read operation in a system with many siblings, more guidance on usage and output would be beneficial to ensure correct agent invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters ('id' and 'expand') fully. The description doesn't add any meaning beyond what the schema provides, such as explaining the purpose of 'expand' or format examples. With high schema coverage, baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get a specific invoice by ID' clearly states the verb ('Get') and resource ('invoice'), and specifies it's for a specific item by ID. However, it doesn't distinguish from sibling tools like 'get_invoices' (plural) beyond the ID specificity, which is somewhat implied but not explicitly contrasted.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'get_invoices' for listing multiple invoices or clarify if this is for retrieving a single known invoice versus searching. No exclusions or prerequisites are stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_invoicesC

Retrieve all invoices from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of invoices to return (1-10000, default: 100)
skipNoNumber of invoices to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand (e.g., "customer,projects")
customer_idNoFilter by specific customer ID
from_dateNoStart date for filtering (YYYY-MM-DD format)
to_dateNoEnd date for filtering (YYYY-MM-DD format)
filterNoOData filter expression (e.g., "status eq 'sent'" or "total gt 1000")
orderbyNoOData orderby expression (e.g., "invoiceDate desc" or "total desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It states this is a retrieval operation but doesn't mention pagination behavior (implied by 'top' and 'skip' parameters), rate limits, authentication requirements, or what format the invoices are returned in. For a 9-parameter tool with no annotations, this is insufficient.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that states the core purpose without unnecessary words. It's appropriately sized and front-loaded with the essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 9 parameters, no annotations, and no output schema, the description is inadequate. It doesn't explain the relationship between parameters, how filtering works, what 'all invoices' means in practice, or what the return format looks like. The agent would need to infer too much from the parameter schema alone.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, so all parameters are well-documented in the schema itself. The description adds no additional parameter information beyond what's already in the schema descriptions. This meets the baseline expectation when schema coverage is complete.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Retrieve') and resource ('all invoices from TimeChimp'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'get_invoice_by_id' or explain what 'all invoices' means in context of the available filters.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'get_invoice_by_id' for single invoices or other filtering tools. It mentions retrieving 'all invoices' but doesn't clarify if this is the primary listing tool versus filtered searches.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mileageC

Retrieve all mileage entries from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of mileage entries to return (1-10000, default: 100)
skipNoNumber of mileage entries to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand (e.g., "user,project,customer")
user_idNoFilter by specific user ID
project_idNoFilter by specific project ID
customer_idNoFilter by specific customer ID
from_dateNoStart date for filtering (YYYY-MM-DD format)
to_dateNoEnd date for filtering (YYYY-MM-DD format)
filterNoOData filter expression (e.g., "distance gt 50" or "approved eq true")
orderbyNoOData orderby expression (e.g., "date desc" or "distance desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It states the action ('Retrieve') but doesn't mention whether this requires authentication, has rate limits, returns paginated results, or what format the data comes in. For a tool with 11 parameters and no annotation coverage, this leaves significant behavioral questions unanswered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that states exactly what the tool does with zero wasted words. It's appropriately sized for a retrieval tool and front-loads the core functionality.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 11 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain what 'mileage entries' contain, what format they return in, or how to interpret the various filtering options. The agent would need to rely heavily on the parameter schema alone without contextual guidance.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with all 11 parameters well-documented in the schema itself. The description adds no additional parameter information beyond what's already in the schema, so it meets the baseline of 3 for high schema coverage without adding value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Retrieve') and resource ('all mileage entries from TimeChimp'), making the purpose immediately understandable. It doesn't specifically differentiate from sibling tools like 'get_mileage_by_id' or 'get_mileage_status_history', but the scope ('all') provides some implicit distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'get_mileage_by_id' for single entries or 'get_mileage_status_history' for status changes. There's no mention of prerequisites, access requirements, or typical use cases for retrieving all mileage entries versus filtered subsets.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mileage_by_idB

Get a specific mileage entry by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMileage entry ID
expandNoComma-delimited list of properties to expand

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It states this is a read operation ('Get'), but doesn't cover critical aspects like authentication requirements, rate limits, error handling, or what happens if the ID doesn't exist. For a retrieval tool with zero annotation coverage, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core purpose and appropriately sized for a simple retrieval tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's low complexity (simple retrieval), 100% schema coverage, and no output schema, the description is minimally adequate. However, with no annotations and missing behavioral details (like error cases), it doesn't fully prepare an agent for reliable invocation, keeping it at the minimum viable level.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already fully documents both parameters (id and expand). The description doesn't add any meaning beyond what the schema provides—it mentions 'by ID' which is redundant with the schema's parameter description. Baseline 3 is appropriate when the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get') and resource ('a specific mileage entry by ID'), making the purpose unambiguous. However, it doesn't explicitly differentiate from sibling tools like 'get_mileage' (which likely lists multiple entries) or 'get_mileage_status_history' (which focuses on status changes), missing full sibling distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'get_mileage' for listing entries or 'get_mileage_vehicle_by_id' for vehicle details, leaving the agent to infer usage from naming patterns alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mileage_status_historyC

Query status history modification records of a mileage entry

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMileage entry ID
topNoMaximum number of status history records to return (1-10000, default: 100)
skipNoNumber of status history records to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand
filterNoOData filter expression
orderbyNoOData orderby expression (e.g., "modifiedOn desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It only states the tool queries records, implying a read-only operation, but lacks details on permissions, rate limits, pagination behavior (beyond what's in the schema), error handling, or return format. For a tool with 7 parameters and no output schema, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core purpose and appropriately sized for the tool's complexity. Every word earns its place, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (7 parameters, no annotations, no output schema), the description is incomplete. It doesn't address behavioral aspects like authentication needs, rate limits, or what the query returns (e.g., list of status changes with timestamps). Without annotations or output schema, the description should provide more context to help the agent understand the tool's full behavior and results.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, meaning all parameters are documented in the schema itself. The description adds no additional parameter semantics beyond what's in the schema (e.g., it doesn't explain how 'filter' or 'orderby' expressions work in practice). This meets the baseline of 3 for high schema coverage, but doesn't provide extra value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Query status history modification records of a mileage entry.' It specifies the verb ('Query'), resource ('status history modification records'), and scope ('of a mileage entry'). However, it doesn't explicitly differentiate from sibling tools like 'get_expense_status_history' or 'get_mileage_by_id', which would be needed for a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a valid mileage entry ID), compare it to similar tools like 'get_expense_status_history', or specify use cases (e.g., auditing changes). This leaves the agent with insufficient context for optimal tool selection.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mileage_vehicle_by_idC

Get a specific mileage vehicle by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMileage vehicle ID
expandNoComma-delimited list of properties to expand

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. It only states the basic action ('Get') without mentioning any behavioral traits such as read-only nature, authentication requirements, error handling, rate limits, or what happens if the ID doesn't exist. This leaves significant gaps for a tool that likely queries data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It is appropriately sized and front-loaded, making it easy to understand at a glance, with no wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description is incomplete. It doesn't cover behavioral aspects like safety, permissions, or response format, which are crucial for a retrieval tool. While the schema covers parameters well, the overall context for an AI agent to use this tool effectively is insufficient, especially compared to sibling tools that might have similar gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, with clear documentation for both parameters ('id' and 'expand'). The description doesn't add any meaning beyond the schema, such as explaining the format of 'id' (e.g., numeric ID) or examples for 'expand'. However, since the schema coverage is high, the baseline score of 3 is appropriate as the schema handles the parameter semantics adequately.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and resource ('a specific mileage vehicle by ID'), making the purpose understandable. However, it doesn't distinguish this tool from sibling tools like 'get_mileage_vehicles' (which likely lists all vehicles) or 'get_mileage_by_id' (which retrieves mileage entries rather than vehicles), missing explicit differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. For example, it doesn't specify if this is for retrieving a single vehicle's details after listing vehicles with 'get_mileage_vehicles', or clarify its role compared to other 'get_*_by_id' tools like 'get_mileage_by_id'. The description offers no context or exclusions for usage.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_mileage_vehiclesC

Retrieve all mileage vehicles from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of mileage vehicles to return (1-10000, default: 100)
skipNoNumber of mileage vehicles to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand (e.g., "users")
active_onlyNoOnly return active mileage vehicles (default: false)
filterNoOData filter expression (e.g., "brand eq 'Toyota'" or "active eq true")
orderbyNoOData orderby expression (e.g., "brand asc" or "created desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It states it's a retrieval operation, implying read-only behavior, but doesn't disclose pagination behavior (implied by 'top' and 'skip' parameters), rate limits, authentication needs, or what 'active_only' means in practice. This leaves significant behavioral gaps for an agent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's front-loaded and wastes no space, making it easy for an agent to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description is incomplete for a tool with 7 parameters. It doesn't explain return values (e.g., list structure, fields), error handling, or how parameters like 'filter' and 'orderby' (OData expressions) should be used, leaving the agent with insufficient context for reliable invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, with all 7 parameters well-documented in the schema (e.g., 'top' for max results, 'skip' for pagination). The description adds no parameter semantics beyond the schema, so it meets the baseline of 3 where the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Retrieve') and resource ('all mileage vehicles'), making the purpose immediately understandable. However, it doesn't differentiate this tool from sibling tools like 'get_mileage_vehicle_by_id' or 'get_mileage', which might retrieve specific vehicles or mileage records rather than vehicles themselves.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. With siblings like 'get_mileage_vehicle_by_id' (for a specific vehicle) and 'get_mileage' (for mileage records), the description lacks context on choosing between list vs. detail views or related resources.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_by_idC

Get a specific project by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesProject ID
expandNoComma-delimited list of properties to expand

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It states it's a read operation ('Get'), implying non-destructive behavior, but lacks details on permissions, rate limits, error responses, or output format. For a tool with no annotations, this leaves significant behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero waste. It's front-loaded with the core purpose and appropriately sized for a simple retrieval tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and a read operation with two parameters, the description is incomplete. It doesn't explain what data is returned, error handling, or usage context. For a tool in a set with many siblings, more guidance would help the agent use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents both parameters ('id' and 'expand'). The description adds no parameter-specific information beyond implying the 'id' is required. Baseline 3 is appropriate as the schema handles the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get') and resource ('a specific project by ID'), making the purpose unambiguous. It distinguishes from sibling tools like 'get_projects' (plural) by specifying retrieval of a single project, though it doesn't explicitly contrast with other 'get_by_id' tools (e.g., 'get_contact_by_id').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a valid project ID), contrast with 'get_projects' for listing multiple projects, or specify error conditions (e.g., what happens if the ID doesn't exist).

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_project_insightsB

Get project insights including hours, budget, costs, and revenue data

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesProject ID

TDQS

B3.1/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It states 'Get' implying a read operation, but doesn't disclose behavioral traits like authentication needs, rate limits, data freshness, or whether this aggregates real-time vs. historical data. For a financial insights tool with no annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Single sentence, front-loaded with the core purpose, listing key data types efficiently. No redundant words or structural issues—every part of the description earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given one parameter with full schema coverage and no output schema, the description is minimally complete for a read operation. However, as a financial insights tool with no annotations, it should do more to explain return format (e.g., structured metrics vs. raw data) and usage context. It's adequate but has clear gaps in behavioral context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% for the single parameter 'id', so the schema already documents it as 'Project ID'. The description doesn't add meaning beyond what the schema provides—it doesn't clarify format constraints or example values. Baseline 3 is appropriate when schema handles parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and the resource ('project insights'), specifying the data types included (hours, budget, costs, revenue). It distinguishes from siblings like 'get_project_by_id' by focusing on insights rather than basic project details. However, it doesn't explicitly contrast with 'get_projects' for listing multiple projects.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like 'get_project_by_id' or 'get_projects'. The description implies usage for detailed financial/metric insights on a specific project, but lacks clear exclusions or prerequisites. It doesn't mention if this is for reporting vs. operational purposes.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_projectsC

Retrieve all projects from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of projects to return (1-10000, default: 100)
skipNoNumber of projects to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand (e.g., "customer,tasks")
active_onlyNoOnly return active projects (default: false)
filterNoOData filter expression (e.g., "name eq 'Project Name'" or "active eq true")
orderbyNoOData orderby expression (e.g., "name desc" or "createdAt desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but offers minimal behavioral information. It doesn't disclose whether this is a read-only operation, what authentication is required, rate limits, pagination behavior beyond the 'skip' parameter, or what format the returned projects will have. 'Retrieve all projects' implies a list operation but lacks crucial implementation details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is maximally concise with a single clear sentence that states the core functionality without any wasted words. It's appropriately sized for a straightforward retrieval operation and front-loads the essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters, no annotations, and no output schema, the description is insufficiently complete. It doesn't explain what 'projects' contain, how results are structured, authentication requirements, or error conditions. The agent would need to guess about the return format and operational constraints despite the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description adds no parameter information beyond what's already in the schema, which has 100% coverage with detailed descriptions for all 7 parameters. Since the schema does the heavy lifting, the baseline score of 3 is appropriate, though the description could have provided context about how parameters interact or typical use cases.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Retrieve') and resource ('projects from TimeChimp'), making the purpose unambiguous. However, it doesn't differentiate from sibling tools like 'get_project_by_id' or 'get_project_insights', which would require more specificity about scope or filtering capabilities.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. There's no mention of when to choose 'get_projects' over 'get_project_by_id' for single projects, or 'get_project_insights' for analytical data, leaving the agent without contextual usage instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tag_by_idC

Get a specific tag by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTag ID
expandNoComma-delimited list of properties to expand

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It states this is a read operation ('Get'), but doesn't mention authentication requirements, rate limits, error behavior (e.g., what happens if the ID doesn't exist), or response format. For a tool with zero annotation coverage, this leaves significant behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is perfectly concise at just 5 words, front-loading the essential information with zero wasted words. Every word earns its place in conveying the core purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a read operation with no annotations and no output schema, the description is insufficient. It doesn't explain what a 'tag' represents in this system, what information is returned, or how this differs from the sibling 'get_tags' tool. The context signals show this is a simple tool, but more completeness would be helpful.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents both parameters thoroughly. The description doesn't add any additional meaning about the parameters beyond what's in the schema. The baseline of 3 is appropriate when the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get') and resource ('a specific tag by ID'), making the purpose immediately understandable. However, it doesn't distinguish this tool from its sibling 'get_tags' (which presumably lists all tags), missing an opportunity for full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'get_tags' or other get_by_id tools. There's no mention of prerequisites, error conditions, or typical use cases for retrieving a single tag versus listing all tags.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tagsC

Retrieve all tags from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of tags to return (1-10000, default: 100)
skipNoNumber of tags to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand
active_onlyNoOnly return active tags (default: false)
filterNoOData filter expression (e.g., "name eq 'Important'" or "active eq true")
orderbyNoOData orderby expression (e.g., "name asc" or "created desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but only states the basic action without disclosing behavioral traits. It doesn't mention whether this is a read-only operation, potential rate limits, authentication needs, pagination behavior, or what the return format looks like (especially critical without an output schema).

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, clear sentence with zero wasted words. It's appropriately sized and front-loaded with the essential purpose, making it highly efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (7 parameters, no annotations, no output schema), the description is insufficient. It doesn't explain return values, pagination behavior, error conditions, or how parameters interact (e.g., combining filter with active_only). For a list retrieval tool with rich filtering options, more context is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 7 parameters with descriptions, defaults, and constraints. The description adds no additional parameter information beyond what's in the schema, meeting the baseline for high coverage.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Retrieve') and resource ('all tags from TimeChimp'), making the purpose immediately understandable. However, it doesn't differentiate from sibling tools like 'get_tag_by_id' or explain scope beyond 'all tags' (e.g., filtering capabilities mentioned in parameters).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like 'get_tag_by_id' for specific tags or other list tools. The description lacks context about prerequisites, typical use cases, or comparison with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_task_by_idC

Get a specific task by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTask ID
expandNoComma-delimited list of properties to expand

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but only states the basic action. It lacks details on permissions, rate limits, error responses, or whether it's a safe read operation (implied by 'Get' but not explicit). This is inadequate for a tool with zero annotation coverage.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no wasted words. It's front-loaded with the core purpose, making it easy to scan and understand quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations, no output schema, and a read operation with two parameters, the description is incomplete. It doesn't cover behavioral aspects like safety, error handling, or return format, leaving significant gaps for an AI agent to use the tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters 'id' and 'expand' are documented in the schema. The description adds no additional meaning beyond implying 'id' is required, which is already in the schema. Baseline 3 is appropriate as the schema handles parameter documentation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Get a specific task by ID' clearly states the verb ('Get') and resource ('task'), specifying retrieval by ID. It distinguishes from sibling tools like 'get_tasks' (plural) by focusing on a single task, but doesn't explicitly contrast with other 'get_*_by_id' tools (e.g., 'get_contact_by_id').

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a valid task ID), contrast with 'get_tasks' for listing, or specify error handling for invalid IDs, leaving usage context unclear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_tasksC

Retrieve all tasks from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of tasks to return (1-10000, default: 100)
skipNoNumber of tasks to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand (e.g., "project")
active_onlyNoOnly return active tasks (default: false)
project_idNoFilter by specific project ID
filterNoOData filter expression (e.g., "name eq 'Task Name'" or "active eq true")
orderbyNoOData orderby expression (e.g., "name asc" or "created desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It only states the action ('Retrieve') without mentioning whether this is a read-only operation, if it requires authentication, potential rate limits, or what the return format looks like. This leaves significant gaps for a tool with 8 parameters and no output schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that directly states the tool's purpose without unnecessary words. It's appropriately sized and front-loaded with the essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 8 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain the return format, pagination behavior, error conditions, or how it differs from sibling tools. The description should provide more context given the tool's complexity and lack of structured metadata.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, providing detailed documentation for all 8 parameters. The description doesn't add any additional parameter information beyond what's already in the schema, so it meets the baseline of 3 where the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Retrieve') and resource ('all tasks from TimeChimp'), making the purpose unambiguous. However, it doesn't differentiate from sibling tools like 'get_task_by_id' or 'get_projects', which would require mentioning this tool's scope of returning all tasks rather than specific ones.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'get_task_by_id' or 'get_projects', nor does it mention prerequisites or context for usage. It merely states what the tool does without indicating appropriate scenarios.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_time_entriesC

Retrieve time entries from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of time entries to return (1-10000, default: 100)
skipNoNumber of time entries to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand (e.g., "user,project,task")
user_idNoFilter by specific user ID
project_idNoFilter by specific project ID
from_dateNoStart date for filtering (YYYY-MM-DD format)
to_dateNoEnd date for filtering (YYYY-MM-DD format)
filterNoOData filter expression (e.g., "date eq 2023-12-31" or "start gt 2023-12-31T23:59:59Z")
orderbyNoOData orderby expression (e.g., "date desc" or "start desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure but offers minimal information. It doesn't mention whether this is a read-only operation (implied by 'Retrieve' but not explicit), authentication requirements, rate limits, pagination behavior beyond what's in parameters, error conditions, or response format. For a tool with 10 parameters and no annotations, this is inadequate behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that gets straight to the point with zero wasted words. It's appropriately sized for a retrieval tool and front-loads the essential information. Every word earns its place in this minimal but complete statement of purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 10 parameters, no annotations, and no output schema, the description is insufficiently complete. It doesn't explain what a 'time entry' contains, what the typical response looks like, authentication requirements, or error handling. The schema handles parameter documentation well, but the description should provide more context about the operation's behavior and results given the tool's complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with each parameter well-documented in the schema itself. The description adds no additional parameter information beyond what's already in the schema. According to scoring rules, when schema_description_coverage is high (>80%), the baseline is 3 even with no param info in description, which applies here.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Retrieve' and resource 'time entries from TimeChimp', making the purpose immediately understandable. It doesn't explicitly differentiate from sibling tools like 'get_time_entry_by_id' or other 'get_' tools, but the resource specificity is clear. The description avoids tautology by not just repeating the tool name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. There are multiple sibling tools for retrieving time-related data (get_time_entry_by_id, get_time_entries), but the description doesn't indicate this is for listing/filtering multiple entries versus getting a single entry. No context about prerequisites, typical use cases, or exclusions is provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_time_entry_by_idC

Get a specific time entry by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesTime entry ID
expandNoComma-delimited list of properties to expand

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states it's a read operation ('Get'), implying safety, but lacks details on authentication needs, rate limits, error handling (e.g., invalid ID), or response format. For a tool with zero annotation coverage, this leaves significant gaps in understanding its behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, front-loaded sentence with zero waste—it directly states the tool's purpose without unnecessary words. Every part of the sentence ('Get a specific time entry by ID') contributes essential information, making it highly efficient and easy to parse.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description is incomplete for a tool with parameters. It doesn't explain return values, error conditions, or behavioral traits like idempotency. While the purpose is clear, the lack of context for usage and behavior makes it inadequate for safe and effective tool invocation by an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents both parameters (id and expand). The description adds no additional meaning beyond implying 'id' is required for retrieval, which is already clear from the schema. Baseline 3 is appropriate as the schema does the heavy lifting, but the description doesn't compensate with extra context like examples for 'expand'.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Get') and resource ('a specific time entry by ID'), making the purpose immediately understandable. It distinguishes this from sibling tools like 'get_time_entries' (plural) by specifying retrieval of a single entry via ID. However, it doesn't explicitly contrast with other 'get_by_id' tools (e.g., get_contact_by_id), which slightly limits differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'get_time_entries' for listing multiple entries or clarify prerequisites (e.g., needing a valid time entry ID). Usage is implied from the name but not explicitly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_user_by_idC

Get a specific user by ID

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesUser ID
expandNoComma-delimited list of properties to expand

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. It states the action ('Get') but doesn't describe what 'Get' entails—whether it's a read-only operation, what data is returned, error handling for invalid IDs, or any rate limits. The description is too minimal to provide adequate behavioral context for a tool with potential side effects or constraints.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no wasted words. It's front-loaded with the core purpose, making it easy to scan and understand quickly. Every word contributes directly to stating what the tool does.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the lack of annotations and output schema, the description is incomplete. It doesn't explain what data is returned, error conditions, or behavioral aspects like read-only nature. For a tool that likely returns user details, more context is needed to help an agent use it effectively without trial and error.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents both parameters ('id' and 'expand'). The description doesn't add any parameter-specific details beyond what's in the schema, such as examples for the 'expand' parameter or ID format constraints. This meets the baseline score when schema coverage is high.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Get') and resource ('a specific user by ID'), making the purpose immediately understandable. It distinguishes from sibling tools like 'get_users' (which retrieves multiple users) by specifying retrieval of a single user. However, it doesn't explicitly mention what 'get' entails (e.g., retrieving user details), which prevents a perfect score.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention sibling tools like 'get_users' for listing multiple users or 'get_user_by_id' versus other 'get_*_by_id' tools for different resource types. There's no context about prerequisites, authentication needs, or error conditions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_usersC

Retrieve all users from TimeChimp

ParametersJSON Schema
NameRequiredDescriptionDefault
topNoMaximum number of users to return (1-10000, default: 100)
skipNoNumber of users to skip for pagination (default: 0)
countNoWhether to include the total count of results (default: true)
expandNoComma-delimited list of properties to expand
active_onlyNoOnly return active users (default: false)
filterNoOData filter expression (e.g., "firstName eq 'John'" or "active eq true")
orderbyNoOData orderby expression (e.g., "firstName asc" or "lastName desc")

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden for behavioral disclosure. While 'Retrieve' implies a read operation, it doesn't mention pagination behavior (implied by skip/top parameters), rate limits, authentication requirements, or what format the results will be returned in. The description is minimal and lacks important operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise - a single sentence that states the core purpose without any fluff. It's front-loaded with the essential information and wastes no words, though this conciseness comes at the cost of completeness.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with 7 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain what 'users' means in this context, what fields are returned, how results are structured, or provide any examples. The minimal description leaves too much undefined for a tool with this complexity.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage with detailed parameter documentation, so the baseline is 3. The description adds no additional parameter context beyond what's already in the schema properties, but doesn't need to since the schema is comprehensive.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Retrieve') and resource ('all users from TimeChimp'), making the purpose immediately understandable. However, it doesn't differentiate this tool from its sibling 'get_user_by_id' or explain what 'all users' means in context of the filtering parameters available.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'get_user_by_id' or other get_* tools. There's no mention of prerequisites, typical use cases, or when this bulk retrieval approach is preferred over individual lookups.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_contactC

Update an existing contact

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesContact ID
nameYesThe contact name
jobTitleNoThe contact job title
emailNoThe contact email address
phoneNoThe contact phone number
useForInvoicingNoWhether the contact info will be used for invoicing
activeNoWhether the contact can be used
customersNoList of customer IDs to link to this contact

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. 'Update an existing contact' implies a mutation operation, but it doesn't disclose any behavioral traits such as required permissions, whether changes are reversible, rate limits, or what happens to fields not specified in the update. This leaves significant gaps for an agent to understand the tool's behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with no wasted words. It's front-loaded with the core action and resource, making it easy to parse quickly. Every word earns its place in conveying the basic purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity of an update operation with 8 parameters, no annotations, and no output schema, the description is incomplete. It doesn't address behavioral aspects like side effects, error conditions, or return values, leaving the agent with insufficient context to use the tool effectively beyond the basic schema.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, with clear documentation for all 8 parameters (e.g., 'id' as 'Contact ID', 'name' as 'The contact name'). The description adds no additional meaning beyond what the schema provides, so it meets the baseline score of 3 for high schema coverage without compensating value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Update an existing contact' clearly states the action (update) and resource (contact), which is better than a tautology. However, it doesn't differentiate this tool from sibling update tools like update_customer or update_user, nor does it specify what aspects of a contact can be updated beyond the generic term.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing contact ID), when not to use it (e.g., for creating new contacts), or refer to sibling tools like create_contact or delete_contact for different operations.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_customerC

Update an existing customer

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesCustomer ID
nameYesThe customer name
activeNoWhether the customer can be used
relationIdNoThe customer number
addressNoThe customer address info
phoneNoThe customer phone number
emailNoThe customer email address
websiteNoThe customer website URL
paymentPeriodNoThe customer payment term in days
hourlyRateNoThe customer default hourly price
mileageRateNoThe customer default mileage price, per KM
ibanNoThe customer IBAN
bicNoThe customer BIC
vatNumberNoThe customer VAT number
kvkNumberNoThe customer business ID
invoiceAddressNoThe customer invoice address info, if differs from the customer address info
notesNoThe customer notes
prospectNoThe customer is a prospect
vatRateNoVat rate to be linked with the customer
tagsNoList of tag IDs to link to this customer
contactsNoList of contact IDs to link to this customer

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. 'Update an existing customer' implies a mutation but doesn't disclose behavioral traits like required permissions, whether updates are partial or full, if changes are reversible, error handling, or side effects. For a mutation tool with 21 parameters, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero waste. It's appropriately sized and front-loaded, directly stating the tool's purpose without unnecessary elaboration.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (21 parameters, nested objects, no output schema, and no annotations), the description is incomplete. It doesn't explain what the tool returns, how to handle partial updates, or any behavioral context. For a mutation tool with rich input schema but no output or annotations, more guidance is needed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents all 21 parameters. The description adds no additional meaning beyond what's in the schema (e.g., no examples, formatting rules, or constraints). Baseline 3 is appropriate when the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Update an existing customer' clearly states the verb ('Update') and resource ('customer'), but it's vague about what specifically gets updated. It doesn't distinguish this tool from other update tools like update_contact or update_project, which follow the same pattern for different resources.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing customer ID), when not to use it, or how it differs from create_customer or other update operations. The agent must infer usage from the tool name alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_expenseC

Update an existing expense

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesExpense ID
dateNoThe expense date (YYYY-MM-DD format)
notesNoThe expense notes
quantityNoThe expense quantity
rateYesThe expense rate/price
billableNoWhether the expense can be invoiced
customerNoCustomer to be linked with the expense
projectNoProject to be linked with the expense
productNoProduct to be linked with the expense
userYesUser to be linked with the expense
vatRateNoVAT rate to be linked with the expense

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. While 'Update' implies a mutation operation, the description doesn't address critical behavioral aspects: whether this requires specific permissions, if it's idempotent, what happens to fields not provided (partial vs. full updates), error conditions, or rate limits. For a mutation tool with 11 parameters and no annotation coverage, this is a significant gap in transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description consists of a single, efficient sentence: 'Update an existing expense.' It's appropriately sized for the tool's purpose, with zero wasted words. The structure is front-loaded with the core action, though there's no additional context to structure beyond this minimal statement.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (11 parameters, mutation operation, no output schema, and no annotations), the description is insufficiently complete. It doesn't explain what fields can be updated, how partial updates work, what the response looks like, or error handling. For a mutation tool with rich input schema but no output schema or annotations, the description should provide more contextual guidance to help the agent use it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, with each parameter well-documented in the schema itself (e.g., 'id' as 'Expense ID', 'date' with format specification). The description adds no parameter information beyond what's already in the schema. According to scoring rules, when schema_description_coverage is high (>80%), the baseline is 3 even with no param info in the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Update an existing expense' clearly states the verb ('Update') and resource ('expense'), making the basic purpose understandable. However, it doesn't differentiate this tool from sibling tools like 'update_expense_client_status' or 'update_expense_status', which also update expense-related data but with different scopes. The description is adequate but lacks sibling differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. With siblings like 'update_expense_client_status' and 'update_expense_status' that handle specific aspects of expense updates, the agent receives no indication that this tool is for general expense field updates rather than status changes. There's also no mention of prerequisites or when not to use it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_expense_client_statusC

Update the client status of expenses (external approval/invoicing status)

ParametersJSON Schema
NameRequiredDescriptionDefault
clientStatusYesThe external approval/invoicing status of the expense (used only when client portal is enabled)
messageNoStatus history message
expensesYesList of expenses to be updated (maximum of 100 entries)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but only states it's an update operation. It doesn't disclose whether this requires special permissions, if changes are reversible, rate limits, or what happens to expenses not in the list. For a mutation tool with zero annotation coverage, this is insufficient behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that communicates the core purpose without unnecessary words. It's appropriately sized and front-loaded with the essential information.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with no annotations and no output schema, the description is incomplete. It doesn't explain what the tool returns, error conditions, or important behavioral aspects like the 100-entry limit mentioned in the schema. The agent lacks sufficient context to use this tool effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are well-documented in the schema. The description adds minimal value beyond the schema - it mentions 'external approval/invoicing status' which aligns with the clientStatus parameter but doesn't provide additional semantic context. Baseline 3 is appropriate when schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Update') and resource ('client status of expenses') with specific context about external approval/invoicing status. It distinguishes from sibling 'update_expense_status' by focusing on client portal status rather than internal status, though this distinction could be more explicit.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives like 'update_expense_status' or 'update_mileage_client_status'. It mentions 'used only when client portal is enabled' in the schema but not in the description itself, leaving the agent without contextual usage instructions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_expense_statusC

Update the status of expenses (internal approval/invoicing status)

ParametersJSON Schema
NameRequiredDescriptionDefault
messageNoStatus history message
expensesYesList of expenses to be updated (maximum of 100 entries)
statusYesThe internal approval/invoicing status of the expense

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It mentions 'update' implying mutation but doesn't disclose behavioral traits like required permissions, whether changes are reversible, rate limits, or what happens to the status history. The description adds minimal context beyond the basic action.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core purpose. It avoids unnecessary words, though it could be slightly more structured by explicitly mentioning the tool's scope relative to siblings.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given a mutation tool with no annotations and no output schema, the description is incomplete. It lacks details on behavioral aspects (e.g., side effects, error handling) and doesn't compensate for the absence of structured safety or output information, leaving gaps for an AI agent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all parameters thoroughly. The description adds no additional meaning beyond what's in the schema (e.g., no extra details on 'message' usage or 'expenses' handling). Baseline 3 is appropriate as the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'update' and resource 'status of expenses', with specific context about 'internal approval/invoicing status'. It distinguishes from siblings like 'update_expense' (general update) and 'update_expense_client_status' (client-facing status), though not explicitly named.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No explicit guidance on when to use this tool versus alternatives like 'update_expense' or 'update_expense_client_status'. The description implies it's for internal status changes but doesn't specify prerequisites, exclusions, or comparative contexts with sibling tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_mileageC

Update an existing mileage entry

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesMileage entry ID
dateNoThe mileage date (YYYY-MM-DD format)
fromAddressNoThe mileage from address
toAddressNoThe mileage to address
notesNoThe mileage notes
distanceYesThe mileage distance in KM
billableNoWhether the mileage can be invoiced
typeYesThe mileage type
customerNoCustomer to be linked with the mileage
projectNoProject to be linked with the mileage
vehicleNoVehicle to be linked with the mileage
userYesUser to be linked with the mileage

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. 'Update an existing mileage entry' implies a mutation operation but doesn't specify whether it requires special permissions, if changes are reversible, what happens to omitted fields (partial vs. full updates), or any rate limits. For a complex mutation tool with 12 parameters, this leaves critical behavioral traits undocumented.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero wasted words. It's front-loaded with the core action ('Update an existing mileage entry') and doesn't include any redundant or verbose phrasing. Every word earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (12 parameters, nested objects, no output schema, and no annotations), the description is insufficiently complete. It doesn't explain what the tool returns, error conditions, or behavioral nuances like partial updates. For a mutation tool with rich input schema but no structured safety hints, the description should provide more contextual guidance to compensate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema description coverage is 100%, with each parameter well-documented in the schema itself (e.g., date format, distance units, enum values). The description adds no additional parameter semantics beyond what the schema provides. According to the rules, when schema coverage is high (>80%), the baseline score is 3 even with no param info in the description.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb ('Update') and resource ('an existing mileage entry'), making the purpose unambiguous. It distinguishes from sibling tools like 'create_mileage' by specifying 'existing' and from 'delete_mileage' by using 'Update'. However, it doesn't explicitly differentiate from similar update tools like 'update_mileage_status' or 'update_mileage_client_status', which slightly reduces specificity.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing mileage ID), exclusions (e.g., what fields can't be updated), or when to choose this over other update tools like 'update_mileage_status'. The agent must infer usage from the name and schema alone.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_mileage_client_statusC

Update the client status of mileage entries (external approval/invoicing status)

ParametersJSON Schema
NameRequiredDescriptionDefault
clientStatusYesThe external approval/invoicing status of the mileage (used only when client portal is enabled)
messageNoStatus history message
mileagesYesList of mileage entries to be updated (maximum of 100 entries)

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full burden but provides limited behavioral insight. It mentions 'external approval/invoicing status' which hints at business workflow context, but doesn't disclose permission requirements, whether this is a destructive operation, rate limits, or what happens when updating multiple entries. The mutation nature ('Update') is clear but lacks operational details.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence that front-loads the core purpose. Every word earns its place - 'Update', 'client status', 'mileage entries', and the parenthetical clarification about external approval/invoicing status all contribute essential information without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a mutation tool with 3 parameters, no annotations, and no output schema, the description is insufficient. It doesn't explain what the tool returns, error conditions, permission requirements, or how it differs from similar update tools. The 100% schema coverage helps, but the description itself lacks completeness for safe and effective tool invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so parameters are well-documented in the schema. The description adds marginal value by emphasizing the client portal context for clientStatus and implying bulk updates ('mileage entries'), but doesn't provide additional semantics beyond what the schema already specifies about parameter purposes and constraints.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Update') and target ('client status of mileage entries'), with specific context about external approval/invoicing status. It distinguishes from sibling 'update_mileage_status' by focusing on client-specific status rather than general mileage status, though it doesn't explicitly name this distinction.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides minimal guidance - it mentions client portal context but doesn't specify when to use this tool versus alternatives like 'update_mileage_status' or 'update_mileage'. No prerequisites, exclusions, or explicit comparison to sibling tools are provided.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_mileage_statusC

Update the status of mileage entries (internal approval/invoicing status)

ParametersJSON Schema
NameRequiredDescriptionDefault
messageNoStatus history message
mileagesYesList of mileage entries to be updated (maximum of 100 entries)
statusYesThe internal approval/invoicing status of the mileage

TDQS

C2.9/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states it's an update operation, implying mutation, but doesn't cover permissions needed, whether changes are reversible, rate limits, or what happens to entries not in the list. For a mutation tool affecting up to 100 entries, this is a significant gap in safety and operational context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero waste. It's front-loaded with the core action and resource, and the parenthetical adds necessary context without redundancy. Every word earns its place, making it easy to parse quickly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (mutation affecting multiple entries), lack of annotations, and no output schema, the description is incomplete. It doesn't address behavioral risks, response format, or error handling. For a tool that modifies up to 100 mileage entries, more context on idempotency, partial updates, or side effects is needed for safe agent use.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema fully documents parameters. The description adds no additional meaning beyond implying 'status' relates to approval/invoicing, which is already clear from the schema's enum values. Baseline 3 is appropriate as the schema does the heavy lifting, but the description doesn't compensate with extra insights like format examples or edge cases.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Update') and resource ('status of mileage entries'), with specific context about what status means ('internal approval/invoicing status'). It distinguishes from siblings like 'update_mileage' (which likely updates mileage data rather than status) and 'update_mileage_client_status' (which appears to handle client-facing status). However, it doesn't explicitly name these distinctions.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like 'update_mileage_client_status' or 'update_expense_status'. The description implies it's for internal approval/invoicing workflows but doesn't specify prerequisites, exclusions, or typical scenarios. Usage is left to inference from the tool name and context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_projectC

Update an existing project

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesProject ID
nameYesThe project name
activeNoWhether the project can be used
codeNoThe project code
notesNoThe project description
colorNoThe project color
startDateNoThe project start date (YYYY-MM-DD format)
endDateNoThe project end date (YYYY-MM-DD format)
invoicingYesThe project invoicing settings
budgetYesThe project budget settings
customerNoCustomer to be linked with the project
mainProjectNoMain project to be linked with the project (if it is a subproject)
subprojectsNoList of subprojects to be linked to the project (if it is a main project)
managersNoList of managers to be linked to the project
tagsNoList of tags to be linked to the project
projectTasksYesList of project tasks to be linked to the project
projectUsersYesList of project users to be linked to the project

TDQS

C2.5/5.0
Behavior1/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure but offers none. It doesn't mention that this is a mutation/write operation (implied by 'update' but not explicit), what permissions are required, whether changes are reversible, how partial updates are handled, or what the response looks like (no output schema). For a complex mutation tool with 17 parameters, this is a critical gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is extremely concise at just three words ('Update an existing project'), which is front-loaded and wastes no space. For a tool where the schema provides extensive detail, this brevity is appropriate, though it may be too minimal given the lack of other guidance.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (17 parameters, nested objects, no annotations, no output schema), the description is insufficient. It doesn't address behavioral aspects like mutation effects, error handling, or response format, nor does it provide usage context. The schema covers parameters well, but the description fails to add necessary context for a mutation tool of this scale.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema has 100% description coverage, thoroughly documenting all 17 parameters and their constraints (e.g., date formats, enum values, conditional usage). The description adds no parameter information beyond what's in the schema, so it meets the baseline of 3 where the schema does all the work, but doesn't compensate or add value.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Update an existing project' clearly states the verb ('update') and resource ('project'), making the basic purpose understandable. However, it doesn't differentiate this tool from its sibling 'update_contact', 'update_customer', etc., beyond the resource name, and doesn't specify what aspects of a project can be updated beyond the generic term.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing an existing project ID), when not to use it (e.g., for creating projects, where 'create_project' exists), or how it differs from other update tools like 'update_user' or 'update_customer' beyond the resource type.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

update_userC

Update an existing user

ParametersJSON Schema
NameRequiredDescriptionDefault
idYesUser ID
displayNameYesThe user name
languageNoThe user language (default: en)
employeeNumberNoThe user employee number
badgeNumberNoThe user badge number
citizenServiceNumberNoThe user citizen service number
roleNoRole to be assigned to the user (default: User)
tagsNoList of tags to be linked with the user
contractsNoList of user contracts to be linked

TDQS

C2.4/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden of behavioral disclosure. 'Update an existing user' implies a mutation operation, but the description doesn't disclose any behavioral traits: it doesn't mention permissions required, whether changes are reversible, rate limits, side effects, or what the response looks like. For a mutation tool with zero annotation coverage, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, efficient sentence with zero waste. It's appropriately sized and front-loaded, though this conciseness comes at the cost of completeness. Every word earns its place by stating the core action, but no more.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the complexity (9 parameters with nested objects), lack of annotations, and no output schema, the description is incomplete. It doesn't help the agent understand the tool's behavior, usage context, or what to expect after invocation. For a mutation tool with rich input schema but no other structured data, the description should do more to compensate.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents all 9 parameters thoroughly with descriptions, enums, and formats. The description adds no parameter semantics beyond what the schema provides—it doesn't explain relationships between parameters, provide examples, or clarify usage. The baseline of 3 is appropriate when the schema does all the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose2/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description 'Update an existing user' is a tautology that restates the tool name 'update_user' with minimal elaboration. It specifies the verb ('Update') and resource ('user'), but doesn't distinguish this tool from sibling update tools like 'update_contact' or 'update_customer' beyond the resource name. No additional context about what aspects of a user can be updated is provided.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives. It doesn't mention prerequisites (e.g., needing a user ID), when not to use it (e.g., for creating new users), or how it differs from sibling tools like 'create_user' or 'get_user_by_id'. The agent must infer usage solely from the tool name and schema.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 46 tool updatesv0.1.0
    • First observedcreate_contact
    • First observedcreate_customer
    • First observedcreate_expense
    • First observedcreate_mileage
    • First observedcreate_project
    • First observedcreate_user
    • First observeddelete_contact
    • First observeddelete_customer
    • First observeddelete_expense
    • First observeddelete_mileage
    • First observeddelete_project
    • First observedget_contact_by_id
    • First observedget_contacts
    • First observedget_customer_by_id
    • First observedget_customers
    • First observedget_expense_by_id
    • First observedget_expense_status_history
    • First observedget_expenses
    • First observedget_invoice_by_id
    • First observedget_invoices
    • First observedget_mileage
    • First observedget_mileage_by_id
    • First observedget_mileage_status_history
    • First observedget_mileage_vehicle_by_id
    • First observedget_mileage_vehicles
    • First observedget_project_by_id
    • First observedget_project_insights
    • First observedget_projects
    • First observedget_tag_by_id
    • First observedget_tags
    • First observedget_task_by_id
    • First observedget_tasks
    • First observedget_time_entries
    • First observedget_time_entry_by_id
    • First observedget_user_by_id
    • First observedget_users
    • First observedupdate_contact
    • First observedupdate_customer
    • First observedupdate_expense
    • First observedupdate_expense_client_status
    • First observedupdate_expense_status
    • First observedupdate_mileage
    • First observedupdate_mileage_client_status
    • First observedupdate_mileage_status
    • First observedupdate_project
    • First observedupdate_user

TDQS

B3/5.0
Disambiguation5/5

Every tool has a clearly distinct purpose with no ambiguity. Tools are organized by resource type (contact, customer, expense, etc.) and action (create, get, update, delete), making it easy to tell them apart. The only potential overlap is between general update tools and specific status update tools, but their descriptions clarify the distinction.

Naming Consistency5/5

Tool names follow a highly consistent verb_noun pattern throughout. All tools use snake_case with clear action prefixes (create_, get_, update_, delete_) followed by the resource name, with occasional modifiers like _by_id or _status_history. There are no deviations in naming conventions.

Tool Count2/5

With 46 tools, the count is excessive for most MCP server purposes. While TimeChimp appears to be a comprehensive time tracking/expense management system, this many tools creates cognitive overhead and suggests the surface could be simplified through parameterization or resource grouping. A more focused set of 15-25 tools would likely suffice.

Completeness5/5

The tool surface provides complete CRUD/lifecycle coverage for all major domain entities (contacts, customers, expenses, mileage, projects, users, invoices, tags, tasks, time entries). There are no obvious gaps - every resource has create, read, update, and delete operations where appropriate, plus specialized operations like status updates and insights retrieval.

Maintenance

ActivityInactive
ResponsivenessSyncing

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • F
    license
    B
    quality
    D
    maintenance
    Enables AI assistants to interact with the Tripletex accounting API to manage time tracking, projects, and timesheet approvals through natural language. It also supports searching and managing outgoing invoices and processing supplier invoice approvals.
    31
    2
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ArmandSwirc/TimeChimpMCP'

If you have feedback or need assistance with the MCP directory API, please join our Discord server