TimeChimp MCP Server
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@TimeChimp MCP ServerList my time entries from this week"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
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
Clone or download this repository:
git clone <repository-url>
cd TimeJSInstall dependencies:
npm installMake the server executable:
chmod +x timechimp-mcp-server.jsConfiguration
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-hereGetting Your TimeChimp API Key
Log in to your TimeChimp account
Go to your profile settings
Navigate to the API section
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 installStep 2: Set Up Your API Key
Create a .env file in the project directory:
echo "TIMECHIMP_API_KEY=your-actual-api-key-here" > .envStep 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
Server not connecting: Ensure the path in
cwdis correct and points to the directory containingtimechimp-mcp-server.jsAPI key errors: Verify your API key is correct and has proper permissions in TimeChimp
Node.js not found: Make sure Node.js is installed and accessible from the command line
Permission errors: Ensure Claude Desktop has permission to execute Node.js and access the project directory
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 devAvailable 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 expressionorderby(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 IDexpand(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 nameactive(boolean, optional): Whether the project can be used (default: true)code(string, optional): The project codenotes(string, optional): The project descriptioncolor(string, optional): The project colorstartDate(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 settingsmethod(string, optional): The project invoicing method usedAllowed 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 referencedate(string, optional): The project invoicing date (YYYY-MM-DD format, only used when invoicing method = ProjectRate)
budget(object, optional): The project budget settingsmethod(string, optional): The project budget method usedAllowed 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 projectid(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 projecttags(array, optional): List of tags to be linked to the projectprojectTasks(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 IDname(string, required): The project nameactive(boolean, optional): Whether the project can be usedcode(string, optional): The project codenotes(string, optional): The project descriptioncolor(string, optional): The project colorstartDate(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 settingsmethod(string, optional): The project invoicing method usedAllowed 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 referencedate(string, optional): The project invoicing date (YYYY-MM-DD format, only used when invoicing method = ProjectRate)
budget(object, required): The project budget settingsmethod(string, optional): The project budget method usedAllowed 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 projectid(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 projecttags(array, optional): List of tags to be linked to the projectprojectTasks(array, required): List of project tasks to be linked to the projectprojectUsers(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 expandactive_only(boolean, optional): Only return active users (default: false)filter(string, optional): OData filter expressionorderby(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 IDexpand(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 addressdisplayName(string, required): The user namelanguage(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 linkedstartDate(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 weekhourlyRate(number, optional): The contract sales hourly ratecostHourlyRate(number, optional): The contract purchase hourly ratecontractNumber(string, optional): The contract numbercontractType(object, required): Contract type to be linked to the contractid(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 IDdisplayName(string, required): The user namelanguage(string, optional): The user language (default: en)Allowed values:
en,nl,de,pl,fr,es
employeeNumber(string, optional): The user employee numberbadgeNumber(string, optional): The user badge numbercitizenServiceNumber(string, optional): The user citizen service numberrole(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 usercontracts(array, optional): List of user contracts to be linkedid(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 weekhourlyRate(number, optional): The contract sales hourly ratecostHourlyRate(number, optional): The contract purchase/cost hourly ratecontractNumber(string, optional): The contract numbercontractType(object, required): Contract type to be linked with the contractid(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 IDproject_id(string, optional): Filter by specific project IDfrom_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 expressionorderby(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 IDexpand(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 expressionorderby(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 IDexpand(string, optional): Comma-delimited list of properties to expand
15. create_contact
Create a new contact.
Parameters:
name(string, required): The contact namejobTitle(string, optional): The contact job titleemail(string, optional): The contact email addressphone(string, optional): The contact phone numberuseForInvoicing(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 IDname(string, required): The contact namejobTitle(string, optional): The contact job titleemail(string, optional): The contact email addressphone(string, optional): The contact phone numberuseForInvoicing(boolean, optional): Whether the contact info will be used for invoicingactive(boolean, optional): Whether the contact can be usedcustomers(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 expressionorderby(string, optional): OData orderby expression
19. get_customer_by_id
Get a specific customer by ID.
Parameters:
id(number, required): Customer IDexpand(string, optional): Comma-delimited list of properties to expand
20. create_customer
Create a new customer.
Parameters:
name(string, required): The customer nameactive(boolean, optional): Whether the customer can be used (default: true)relationId(string, optional): The customer numberaddress(object, optional): The customer address infoaddress(string, optional): The address linepostalCode(string, optional): The postal codecity(string, optional): The citycountry(string, optional): The country
phone(string, optional): The customer phone numberemail(string, optional): The customer email addresswebsite(string, optional): The customer website URLpaymentPeriod(number, optional): The customer payment term in dayshourlyRate(number, optional): The customer default hourly pricemileageRate(number, optional): The customer default mileage price, per KMiban(string, optional): The customer IBANbic(string, optional): The customer BICvatNumber(string, optional): The customer VAT numberkvkNumber(string, optional): The customer business IDinvoiceAddress(object, optional): The customer invoice address info, override of the customer address infoaddress(string, optional): The address linepostalCode(string, optional): The postal codecity(string, optional): The citycountry(string, optional): The country
notes(string, optional): The customer notesprospect(boolean, optional): The customer is a prospectvatRate(object, optional): Vat rate to be used for this customerid(number, required): Unique identifier for the vat rate
tags(array, optional): List of tag IDs to link to this customercontacts(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 IDname(string, required): The customer nameactive(boolean, optional): Whether the customer can be usedrelationId(string, optional): The customer numberaddress(object, optional): The customer address infoaddress(string, optional): The address linepostalCode(string, optional): The postal codecity(string, optional): The citycountry(string, optional): The country
phone(string, optional): The customer phone numberemail(string, optional): The customer email addresswebsite(string, optional): The customer website URLpaymentPeriod(number, optional): The customer payment term in dayshourlyRate(number, optional): The customer default hourly pricemileageRate(number, optional): The customer default mileage price, per KMiban(string, optional): The customer IBANbic(string, optional): The customer BICvatNumber(string, optional): The customer VAT numberkvkNumber(string, optional): The customer business IDinvoiceAddress(object, optional): The customer invoice address info, if differs from the customer address infoaddress(string, optional): The address linepostalCode(string, optional): The postal codecity(string, optional): The citycountry(string, optional): The country
notes(string, optional): The customer notesprospect(boolean, optional): The customer is a prospectvatRate(object, optional): Vat rate to be linked with the customerid(number, required): Unique identifier for the vat rate
tags(array, optional): List of tag IDs to link to this customercontacts(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 IDfilter(string, optional): OData filter expressionorderby(string, optional): OData orderby expression
24. get_task_by_id
Get a specific task by ID.
Parameters:
id(number, required): Task IDexpand(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 IDfrom_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 expressionorderby(string, optional): OData orderby expression
26. get_invoice_by_id
Get a specific invoice by ID.
Parameters:
id(number, required): Invoice IDexpand(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 IDproject_id(string, optional): Filter by specific project IDcustomer_id(string, optional): Filter by specific customer IDfrom_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 expressionorderby(string, optional): OData orderby expression
28. get_expense_by_id
Get a specific expense by ID.
Parameters:
id(number, required): Expense IDexpand(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 notesquantity(number, optional): The expense quantity (default: 1)rate(number, required): The expense rate/pricebillable(boolean, optional): Whether the expense can be invoiced (default: true)customer(object, optional): Customer to be linked with the expenseid(number, required): Unique identifier for the customer
project(object, optional): Project to be linked with the expenseid(number, required): Unique identifier for the project
product(object, optional): Product to be linked with the expenseid(number, required): Unique identifier for the product
user(object, required): User to be linked with the expenseid(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 IDdate(string, optional): The expense date (YYYY-MM-DD format)notes(string, optional): The expense notesquantity(number, optional): The expense quantityrate(number, required): The expense rate/pricebillable(boolean, optional): Whether the expense can be invoicedcustomer(object, optional): Customer to be linked with the expenseid(number, required): Unique identifier for the customer
project(object, optional): Project to be linked with the expenseid(number, required): Unique identifier for the project
product(object, optional): Product to be linked with the expenseid(number, required): Unique identifier for the product
user(object, required): User to be linked with the expenseid(number, required): Unique identifier for the user
vatRate(object, optional): VAT rate to be linked with the expenseid(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 messageexpenses(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 statusAllowed 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 messageexpenses(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 IDtop(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 expandfilter(string, optional): OData filter expressionorderby(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 IDproject_id(string, optional): Filter by specific project IDcustomer_id(string, optional): Filter by specific customer IDfrom_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 expressionorderby(string, optional): OData orderby expression
36. get_mileage_by_id
Get a specific mileage entry by ID.
Parameters:
id(number, required): Mileage entry IDexpand(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 addresstoAddress(string, optional): The mileage to addressnotes(string, optional): The mileage notesdistance(number, required): The mileage distance in KMbillable(boolean, optional): Whether the mileage can be invoiced (default: true)type(string, required): The mileage typeAllowed values:
Private,Business,HomeWork
customer(object, optional): Customer to be linked with the mileageid(number, required): Unique identifier for the customer
project(object, optional): Project to be linked with the mileageid(number, required): Unique identifier for the project
vehicle(object, optional): Vehicle to be linked with the mileageid(number, required): Unique identifier for the mileage vehicle
user(object, required): User to be linked with the mileageid(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 IDdate(string, optional): The mileage date (YYYY-MM-DD format)fromAddress(string, optional): The mileage from addresstoAddress(string, optional): The mileage to addressnotes(string, optional): The mileage notesdistance(number, required): The mileage distance in KMbillable(boolean, optional): Whether the mileage can be invoicedtype(string, required): The mileage typeAllowed values:
Private,Business,HomeWork
customer(object, optional): Customer to be linked with the mileageid(number, required): Unique identifier for the customer
project(object, optional): Project to be linked with the mileageid(number, required): Unique identifier for the project
vehicle(object, optional): Vehicle to be linked with the mileageid(number, required): Unique identifier for the mileage vehicle
user(object, required): User to be linked with the mileageid(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 messagemileages(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 statusAllowed 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 messagemileages(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 IDtop(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 expandfilter(string, optional): OData filter expressionorderby(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 expressionorderby(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 IDexpand(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 expandactive_only(boolean, optional): Only return active tags (default: false)filter(string, optional): OData filter expressionorderby(string, optional): OData orderby expression
46. get_tag_by_id
Get a specific tag by ID.
Parameters:
id(number, required): Tag IDexpand(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 trueDate filters:
date eq 2023-12-31DateTime filters:
start gt 2023-12-31T23:59:59ZCombined 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 descMultiple fields:
name desc, createdAt ascNested properties:
address/city asc
Expansion (OData)
The server supports expanding related entities:
Single expansion:
customerMultiple expansions:
customer,projects,tasksNested 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 projectsGET /projects/{id}- Get specific project by IDPOST /projects- Create new projectPUT /projects/{id}- Update existing projectDELETE /projects/{id}- Delete projectGET /projects/{id}/insights- Get project insightsGET /users- Retrieve usersGET /users/{id}- Get specific user by IDPOST /users- Create new userPUT /users/{id}- Update existing userGET /times- Retrieve time entriesGET /times/{id}- Get specific time entry by IDGET /contacts- Retrieve contactsGET /contacts/{id}- Get specific contact by IDPOST /contacts- Create new contactPUT /contacts/{id}- Update existing contactDELETE /contacts/{id}- Delete contactGET /customers- Retrieve customersGET /customers/{id}- Get specific customer by IDPOST /customers- Create new customerPUT /customers/{id}- Update existing customerDELETE /customers/{id}- Delete customerGET /tasks- Retrieve tasksGET /tasks/{id}- Get specific task by IDGET /invoices- Retrieve invoicesGET /invoices/{id}- Get specific invoice by IDGET /expenses- Retrieve expensesGET /expenses/{id}- Get specific expense by IDPOST /expenses- Create new expensePUT /expenses/{id}- Update existing expenseDELETE /expenses/{id}- Delete expensePUT /expenses/status- Update expense status (internal)PUT /expenses/clientStatus- Update expense client status (external)GET /expenses/{id}/statusHistory- Get expense status historyGET /mileage- Retrieve mileage entriesGET /mileage/{id}- Get specific mileage entry by IDPOST /mileage- Create new mileage entryPUT /mileage/{id}- Update existing mileage entryDELETE /mileage/{id}- Delete mileage entryPUT /mileage/status- Update mileage status (internal)PUT /mileage/clientStatus- Update mileage client status (external)GET /mileage/{id}/statusHistory- Get mileage status historyGET /mileageVehicles- Retrieve mileage vehiclesGET /mileageVehicles/{id}- Get specific mileage vehicle by IDGET /tags- Retrieve tagsGET /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 fileAdding New Tools
To add new tools:
Add the tool definition to the
ListToolsRequestSchemahandlerAdd a case for the tool in the
CallToolRequestSchemahandlerImplement the tool method in the
TimechimpMCPServerclassUse the generic
handleGetRequestorhandleGetByIdRequestmethods 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
"TIMECHIMP_API_KEY environment variable is required"
Make sure you've set the
TIMECHIMP_API_KEYenvironment variableVerify the API key is correct and has proper permissions
"TimeChimp API error: 401 Unauthorized"
Check that your API key is valid and not expired
Ensure your TimeChimp account has API access enabled
"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
"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
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'
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 devContributing
Fork the repository
Create a feature branch
Make your changes
Test thoroughly
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 toolscreate_contactC
Create a new contact
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The contact name | |
| jobTitle | No | The contact job title | |
| No | The contact email address | ||
| phone | No | The contact phone number | |
| useForInvoicing | No | Whether the contact info will be used for invoicing (default: false) | |
| active | No | Whether the contact can be used (default: true) | |
| customers | No | List of customer IDs to link to this contact |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The customer name | |
| active | No | Whether the customer can be used (default: true) | |
| relationId | No | The customer number | |
| address | No | The customer address info | |
| phone | No | The customer phone number | |
| No | The customer email address | ||
| website | No | The customer website URL | |
| paymentPeriod | No | The customer payment term in days | |
| hourlyRate | No | The customer default hourly price | |
| mileageRate | No | The customer default mileage price, per KM | |
| iban | No | The customer IBAN | |
| bic | No | The customer BIC | |
| vatNumber | No | The customer VAT number | |
| kvkNumber | No | The customer business ID | |
| invoiceAddress | No | The customer invoice address info, override of the customer address info | |
| notes | No | The customer notes | |
| prospect | No | The customer is a prospect | |
| vatRate | No | Vat rate to be used for this customer | |
| tags | No | List of tag IDs to link to this customer | |
| contacts | No | List of contact IDs to link to this customer |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The expense date (YYYY-MM-DD format, default: UTC today) | |
| notes | No | The expense notes | |
| quantity | No | The expense quantity (default: 1) | |
| rate | Yes | The expense rate/price | |
| billable | No | Whether the expense can be invoiced (default: true) | |
| customer | No | Customer to be linked with the expense | |
| project | No | Project to be linked with the expense | |
| product | No | Product to be linked with the expense | |
| user | Yes | User to be linked with the expense | |
| vatRate | No | VAT rate to be linked with the expense (default: highest percentage) |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The mileage date (YYYY-MM-DD format, default: UTC today) | |
| fromAddress | No | The mileage from address | |
| toAddress | No | The mileage to address | |
| notes | No | The mileage notes | |
| distance | Yes | The mileage distance in KM | |
| billable | No | Whether the mileage can be invoiced (default: true) | |
| type | Yes | The mileage type | |
| customer | No | Customer to be linked with the mileage | |
| project | No | Project to be linked with the mileage | |
| vehicle | No | Vehicle to be linked with the mileage | |
| user | Yes | User to be linked with the mileage |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | The project name | |
| active | No | Whether the project can be used (default: true) | |
| code | No | The project code | |
| notes | No | The project description | |
| color | No | The project color | |
| startDate | No | The project start date (YYYY-MM-DD format) | |
| endDate | No | The project end date (YYYY-MM-DD format) | |
| invoicing | No | The project invoicing settings | |
| budget | No | The project budget settings | |
| customer | No | Customer to be linked with the project | |
| mainProject | No | Main project to be linked with the project (if it is a subproject) | |
| subprojects | No | List of subprojects to be linked to the project (if it is a main project) | |
| managers | No | List of managers to be linked to the project | |
| tags | No | List of tags to be linked to the project | |
| projectTasks | Yes | List of project tasks to be linked to the project (if no tasks are specified, active common tasks will be prefilled) | |
| projectUsers | Yes | List of project users to be linked to the project (if no users are specified, active users will be prefilled) |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| userName | Yes | The user email address | |
| displayName | Yes | The user name | |
| language | No | The user language (default: en) | |
| role | No | Role to be assigned to the user (default: User) | |
| sendInvitation | No | Whether an invitation should be sent to the user (default: false) | |
| contracts | No | List of user contracts to be linked |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Contact ID |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Customer ID |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Expense ID |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mileage entry ID |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Project ID |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Contact ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of contacts to return (1-10000, default: 100) | |
| skip | No | Number of contacts to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand (e.g., "customers") | |
| active_only | No | Only return active contacts (default: false) | |
| filter | No | OData filter expression (e.g., "name eq 'John Doe'" or "active eq true") | |
| orderby | No | OData orderby expression (e.g., "name asc" or "created desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Customer ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of customers to return (1-10000, default: 100) | |
| skip | No | Number of customers to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand (e.g., "contacts,projects") | |
| active_only | No | Only return active customers (default: false) | |
| filter | No | OData filter expression (e.g., "name eq 'Company Name'" or "active eq true") | |
| orderby | No | OData orderby expression (e.g., "name asc" or "created desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Expense ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of expenses to return (1-10000, default: 100) | |
| skip | No | Number of expenses to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand (e.g., "user,project,customer") | |
| user_id | No | Filter by specific user ID | |
| project_id | No | Filter by specific project ID | |
| customer_id | No | Filter by specific customer ID | |
| from_date | No | Start date for filtering (YYYY-MM-DD format) | |
| to_date | No | End date for filtering (YYYY-MM-DD format) | |
| filter | No | OData filter expression (e.g., "amount gt 100" or "approved eq true") | |
| orderby | No | OData orderby expression (e.g., "date desc" or "amount desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Expense ID | |
| top | No | Maximum number of status history records to return (1-10000, default: 100) | |
| skip | No | Number of status history records to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand | |
| filter | No | OData filter expression | |
| orderby | No | OData orderby expression (e.g., "modifiedOn desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Invoice ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of invoices to return (1-10000, default: 100) | |
| skip | No | Number of invoices to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand (e.g., "customer,projects") | |
| customer_id | No | Filter by specific customer ID | |
| from_date | No | Start date for filtering (YYYY-MM-DD format) | |
| to_date | No | End date for filtering (YYYY-MM-DD format) | |
| filter | No | OData filter expression (e.g., "status eq 'sent'" or "total gt 1000") | |
| orderby | No | OData orderby expression (e.g., "invoiceDate desc" or "total desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of mileage entries to return (1-10000, default: 100) | |
| skip | No | Number of mileage entries to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand (e.g., "user,project,customer") | |
| user_id | No | Filter by specific user ID | |
| project_id | No | Filter by specific project ID | |
| customer_id | No | Filter by specific customer ID | |
| from_date | No | Start date for filtering (YYYY-MM-DD format) | |
| to_date | No | End date for filtering (YYYY-MM-DD format) | |
| filter | No | OData filter expression (e.g., "distance gt 50" or "approved eq true") | |
| orderby | No | OData orderby expression (e.g., "date desc" or "distance desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mileage entry ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mileage entry ID | |
| top | No | Maximum number of status history records to return (1-10000, default: 100) | |
| skip | No | Number of status history records to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand | |
| filter | No | OData filter expression | |
| orderby | No | OData orderby expression (e.g., "modifiedOn desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mileage vehicle ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of mileage vehicles to return (1-10000, default: 100) | |
| skip | No | Number of mileage vehicles to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand (e.g., "users") | |
| active_only | No | Only return active mileage vehicles (default: false) | |
| filter | No | OData filter expression (e.g., "brand eq 'Toyota'" or "active eq true") | |
| orderby | No | OData orderby expression (e.g., "brand asc" or "created desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Project ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Project ID |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of projects to return (1-10000, default: 100) | |
| skip | No | Number of projects to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand (e.g., "customer,tasks") | |
| active_only | No | Only return active projects (default: false) | |
| filter | No | OData filter expression (e.g., "name eq 'Project Name'" or "active eq true") | |
| orderby | No | OData orderby expression (e.g., "name desc" or "createdAt desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Tag ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of tags to return (1-10000, default: 100) | |
| skip | No | Number of tags to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand | |
| active_only | No | Only return active tags (default: false) | |
| filter | No | OData filter expression (e.g., "name eq 'Important'" or "active eq true") | |
| orderby | No | OData orderby expression (e.g., "name asc" or "created desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Task ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of tasks to return (1-10000, default: 100) | |
| skip | No | Number of tasks to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand (e.g., "project") | |
| active_only | No | Only return active tasks (default: false) | |
| project_id | No | Filter by specific project ID | |
| filter | No | OData filter expression (e.g., "name eq 'Task Name'" or "active eq true") | |
| orderby | No | OData orderby expression (e.g., "name asc" or "created desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of time entries to return (1-10000, default: 100) | |
| skip | No | Number of time entries to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand (e.g., "user,project,task") | |
| user_id | No | Filter by specific user ID | |
| project_id | No | Filter by specific project ID | |
| from_date | No | Start date for filtering (YYYY-MM-DD format) | |
| to_date | No | End date for filtering (YYYY-MM-DD format) | |
| filter | No | OData filter expression (e.g., "date eq 2023-12-31" or "start gt 2023-12-31T23:59:59Z") | |
| orderby | No | OData orderby expression (e.g., "date desc" or "start desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Time entry ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | User ID | |
| expand | No | Comma-delimited list of properties to expand |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| top | No | Maximum number of users to return (1-10000, default: 100) | |
| skip | No | Number of users to skip for pagination (default: 0) | |
| count | No | Whether to include the total count of results (default: true) | |
| expand | No | Comma-delimited list of properties to expand | |
| active_only | No | Only return active users (default: false) | |
| filter | No | OData filter expression (e.g., "firstName eq 'John'" or "active eq true") | |
| orderby | No | OData orderby expression (e.g., "firstName asc" or "lastName desc") |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Contact ID | |
| name | Yes | The contact name | |
| jobTitle | No | The contact job title | |
| No | The contact email address | ||
| phone | No | The contact phone number | |
| useForInvoicing | No | Whether the contact info will be used for invoicing | |
| active | No | Whether the contact can be used | |
| customers | No | List of customer IDs to link to this contact |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Customer ID | |
| name | Yes | The customer name | |
| active | No | Whether the customer can be used | |
| relationId | No | The customer number | |
| address | No | The customer address info | |
| phone | No | The customer phone number | |
| No | The customer email address | ||
| website | No | The customer website URL | |
| paymentPeriod | No | The customer payment term in days | |
| hourlyRate | No | The customer default hourly price | |
| mileageRate | No | The customer default mileage price, per KM | |
| iban | No | The customer IBAN | |
| bic | No | The customer BIC | |
| vatNumber | No | The customer VAT number | |
| kvkNumber | No | The customer business ID | |
| invoiceAddress | No | The customer invoice address info, if differs from the customer address info | |
| notes | No | The customer notes | |
| prospect | No | The customer is a prospect | |
| vatRate | No | Vat rate to be linked with the customer | |
| tags | No | List of tag IDs to link to this customer | |
| contacts | No | List of contact IDs to link to this customer |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Expense ID | |
| date | No | The expense date (YYYY-MM-DD format) | |
| notes | No | The expense notes | |
| quantity | No | The expense quantity | |
| rate | Yes | The expense rate/price | |
| billable | No | Whether the expense can be invoiced | |
| customer | No | Customer to be linked with the expense | |
| project | No | Project to be linked with the expense | |
| product | No | Product to be linked with the expense | |
| user | Yes | User to be linked with the expense | |
| vatRate | No | VAT rate to be linked with the expense |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| clientStatus | Yes | The external approval/invoicing status of the expense (used only when client portal is enabled) | |
| message | No | Status history message | |
| expenses | Yes | List of expenses to be updated (maximum of 100 entries) |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Status history message | |
| expenses | Yes | List of expenses to be updated (maximum of 100 entries) | |
| status | Yes | The internal approval/invoicing status of the expense |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Mileage entry ID | |
| date | No | The mileage date (YYYY-MM-DD format) | |
| fromAddress | No | The mileage from address | |
| toAddress | No | The mileage to address | |
| notes | No | The mileage notes | |
| distance | Yes | The mileage distance in KM | |
| billable | No | Whether the mileage can be invoiced | |
| type | Yes | The mileage type | |
| customer | No | Customer to be linked with the mileage | |
| project | No | Project to be linked with the mileage | |
| vehicle | No | Vehicle to be linked with the mileage | |
| user | Yes | User to be linked with the mileage |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| clientStatus | Yes | The external approval/invoicing status of the mileage (used only when client portal is enabled) | |
| message | No | Status history message | |
| mileages | Yes | List of mileage entries to be updated (maximum of 100 entries) |
TDQS
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.
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.
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.
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.
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.
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)
| Name | Required | Description | Default |
|---|---|---|---|
| message | No | Status history message | |
| mileages | Yes | List of mileage entries to be updated (maximum of 100 entries) | |
| status | Yes | The internal approval/invoicing status of the mileage |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Project ID | |
| name | Yes | The project name | |
| active | No | Whether the project can be used | |
| code | No | The project code | |
| notes | No | The project description | |
| color | No | The project color | |
| startDate | No | The project start date (YYYY-MM-DD format) | |
| endDate | No | The project end date (YYYY-MM-DD format) | |
| invoicing | Yes | The project invoicing settings | |
| budget | Yes | The project budget settings | |
| customer | No | Customer to be linked with the project | |
| mainProject | No | Main project to be linked with the project (if it is a subproject) | |
| subprojects | No | List of subprojects to be linked to the project (if it is a main project) | |
| managers | No | List of managers to be linked to the project | |
| tags | No | List of tags to be linked to the project | |
| projectTasks | Yes | List of project tasks to be linked to the project | |
| projectUsers | Yes | List of project users to be linked to the project |
TDQS
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.
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.
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.
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.
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.
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
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | User ID | |
| displayName | Yes | The user name | |
| language | No | The user language (default: en) | |
| employeeNumber | No | The user employee number | |
| badgeNumber | No | The user badge number | |
| citizenServiceNumber | No | The user citizen service number | |
| role | No | Role to be assigned to the user (default: User) | |
| tags | No | List of tags to be linked with the user | |
| contracts | No | List of user contracts to be linked |
TDQS
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.
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.
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.
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.
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.
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.
46 tool updates
v0.1.0- First observed
create_contact - First observed
create_customer - First observed
create_expense - First observed
create_mileage - First observed
create_project - First observed
create_user - First observed
delete_contact - First observed
delete_customer - First observed
delete_expense - First observed
delete_mileage - First observed
delete_project - First observed
get_contact_by_id - First observed
get_contacts - First observed
get_customer_by_id - First observed
get_customers - First observed
get_expense_by_id - First observed
get_expense_status_history - First observed
get_expenses - First observed
get_invoice_by_id - First observed
get_invoices - First observed
get_mileage - First observed
get_mileage_by_id - First observed
get_mileage_status_history - First observed
get_mileage_vehicle_by_id - First observed
get_mileage_vehicles - First observed
get_project_by_id - First observed
get_project_insights - First observed
get_projects - First observed
get_tag_by_id - First observed
get_tags - First observed
get_task_by_id - First observed
get_tasks - First observed
get_time_entries - First observed
get_time_entry_by_id - First observed
get_user_by_id - First observed
get_users - First observed
update_contact - First observed
update_customer - First observed
update_expense - First observed
update_expense_client_status - First observed
update_expense_status - First observed
update_mileage - First observed
update_mileage_client_status - First observed
update_mileage_status - First observed
update_project - First observed
update_user
TDQS
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.
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.
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.
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
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
Manage projects, tasks, time tracking, and team collaboration through natural language.
Read time entries, projects, clients, tasks and invoices; log and update tracked time.
Manage Avaza projects, tasks, timesheets, expenses, invoices, and scheduling from AI assistants.
Read teams, spaces, lists and tasks; create, update and comment on tasks and track time.
Related MCP Servers
- FlicenseBqualityDmaintenanceEnables 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.312-

Timesheet MCP Serverofficial
AlicenseBqualityBmaintenanceEnables natural language control of the Timesheet API for timer management, task tracking, and project management through MCP tools.50741MIT- AlicenseNot gradedqualityAmaintenanceEnables interaction with the Clockodo time tracking API, providing tools, prompts, and resources for time tracking, HR analytics, and team management with role-based access.2MIT
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to interact with KIMAI 2 time tracking for managing timesheets, projects, activities, customers, and generating reports.MIT
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
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