timetta-mcp
The timetta-mcp server acts as a universal read-write MCP gateway to the Timetta time-tracking platform's OData API, enabling you to explore, query, create, update, and delete records via clients like Claude Desktop or Gemini CLI.
Available tools:
list_entities()— Discover all queryable OData entity sets (e.g.,TimeEntries,Users,Projects)get_entity_schema(entity)— Inspect field names, data types, and navigation properties for a specific entity before queryingquery_odata(entity, ...)— Query any entity with full OData semantics:Filter records (
filter), select specific fields (select), expand related entities (expand), sort (orderby), and paginate (topdefault 50 / max 200,skip)
create_entity(entity, data)— Create new records via HTTP POSTupdate_entity(entity, id, data)— Partially update existing records via HTTP PATCHdelete_entity(entity, id)— Delete records by ID via HTTP DELETE
Notes:
Write operations (create/update/delete) depend on the permissions of the token used; a read-only token restricts the server accordingly
Supports both static API token and OAuth (email/password) authentication
Base URL, auth URL, and credential storage path are all configurable
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., "@timetta-mcpquery time entries for last 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.
timetta-mcp
MCP server exposing the Timetta main OData API to MCP clients (Claude Desktop, Claude Code, Codex, Gemini CLI, etc.) as a universal read-write gateway.
Tools
Generic CRUD
list_entities()— list queryable OData entities.get_entity_schema(entity)— fields, types and navigation properties of an entity. Call this first to learn real field names.query_odata(entity, filter?, select?, expand?, orderby?, top?, skip?)— query an entity using OData semantics (without the leading$).topdefaults to 50, capped at 200.create_entity(entity, data)— create a record (POST).datais a JSON object of field -> value.update_entity(entity, id, data)— update a record by id (PATCH).dataholds only the fields to change.delete_entity(entity, id)— delete a record by id (DELETE).
Composite (reference-data resolved)
create_issue(title, description?, type_hint?, project_id?, priority_code?, project_task_id?, project_task_hint?, parent_id?, assignee_id?)— create a Timetta issue in one call. Resolves issue type, priority, and project task from reference catalogs internally.link_issues(source_id, destination_id, link_type_name?)— link two issues, resolving the link type by name.attach_file(issue_key_or_id, file_path, filename?)— attach a local file to an issue, resolving it by key or numeric id.change_issue_status(issue_key, status_code)— change the status of an issue. Resolves the status code against the DirectoryEntries catalog.
Related MCP server: getdot-database-skills
Configuration
Variable | Required | Default | Notes |
| one of the two | — | Static Token API value (Bearer), TTL 1 year. Takes priority when set. |
| for OAuth |
| Public OAuth client id used by |
| no |
| OAuth auth server. |
| no | platform default | Where OAuth tokens are stored. Default: |
| no |
| OData base URL. |
| no | — | Default project for |
| no | — | Default priority code for |
| no | — | Default assignee for |
| no | — | Default project task for |
The server can create, update and delete records. Effective permissions are governed entirely by the token — use a read-only Timetta token if write access is not needed.
Authentication
The server picks credentials in this order: TIMETTA_API_TOKEN env var →
credentials file written by timetta-mcp login → otherwise an error asking you
to log in.
Run a one-time login and choose a method (like the Timetta VS Code extension):
timetta-mcp loginToken API (recommended; works with SSO accounts). Paste a long-lived token generated in Timetta settings (TTL ~1 year). It is saved to
TIMETTA_CREDENTIALS_PATHand sent as a Bearer token. No refresh needed.Email + password (OAuth password grant). Exchanges your Timetta email/password for tokens via
grant_type=password(clientexternal) and saves the refresh token. The password is never stored — only the resulting tokens. The server refreshes the access token automatically; re-runtimetta-mcp loginif the refresh token expires (Timetta refresh tokens last roughly 15 days of inactivity).
These are the only two methods Timetta documents for integrations; it offers no
self-service OAuth client registration or browser authorization_code flow.
For CI / automation you can skip login entirely and set TIMETTA_API_TOKEN —
it always takes priority.
Tip: run
timetta-mcpfrom this checkout withuv run timetta-mcp …(oruvx --no-cache --from . timetta-mcp …). Plainuvx --from <path>caches the built environment and may run stale code after you edit the source.
Run
Locally from a checkout:
uvx --from . timetta-mcpFrom the repository:
uvx --from git+https://github.com/sh1rokovs/timetta-mcp timetta-mcpClaude Desktop config
{
"mcpServers": {
"timetta": {
"command": "uvx",
"args": ["--from", "git+https://github.com/sh1rokovs/timetta-mcp", "timetta-mcp"],
"env": { "TIMETTA_API_TOKEN": "YOUR_TOKEN" }
}
}
}Claude Code
CLI command (installs the server straight from GitHub via uvx):
claude mcp add timetta \
--env TIMETTA_API_TOKEN=YOUR_TOKEN \
-- uvx --from git+https://github.com/sh1rokovs/timetta-mcp timetta-mcpScope is selected with -s: local (default, this project only), user
(all projects), or project (writes a committed .mcp.json). To share the
server with everyone who clones the repo, add a .mcp.json at the project root:
{
"mcpServers": {
"timetta": {
"command": "uvx",
"args": ["--from", "git+https://github.com/sh1rokovs/timetta-mcp", "timetta-mcp"],
"env": { "TIMETTA_API_TOKEN": "${TIMETTA_API_TOKEN}" }
}
}
}${TIMETTA_API_TOKEN} is read from the environment, so the token never lands
in the repo. Verify with claude mcp list / claude mcp get timetta.
Codex CLI
Add the server to ~/.codex/config.toml:
[mcp_servers.timetta]
command = "uvx"
args = ["--from", "git+https://github.com/sh1rokovs/timetta-mcp", "timetta-mcp"]
env = { TIMETTA_API_TOKEN = "YOUR_TOKEN" }Or via the CLI:
codex mcp add timetta \
--env TIMETTA_API_TOKEN=YOUR_TOKEN \
-- uvx --from git+https://github.com/sh1rokovs/timetta-mcp timetta-mcpGemini CLI
Add the server to ~/.gemini/settings.json (user scope) or
.gemini/settings.json in the project root (committed, shared scope):
{
"mcpServers": {
"timetta": {
"command": "uvx",
"args": ["--from", "git+https://github.com/sh1rokovs/timetta-mcp", "timetta-mcp"],
"env": { "TIMETTA_API_TOKEN": "$TIMETTA_API_TOKEN" }
}
}
}List configured servers with /mcp inside the Gemini CLI.
Development
uv sync
uv run pytestExample
get_entity_schema("TimeEntries")
query_odata("TimeEntries", filter="Date ge 2024-01-01 and Date le 2024-01-31",
expand="Project,User", select="Date,Hours,Comment")Available Tools
3 toolsget_entity_schemaA
Get fields, types and navigation properties for one Timetta entity (e.g. 'Users', 'TimeEntries'). Call this before query_odata to learn real field names.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, but description clearly indicates a read operation (get schema). Does not mention any destructive behavior, auth, or rate limits, but none expected. Could add 'This is a read-only operation' for extra clarity.
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?
Two sentences: first defines purpose, second provides usage guidance. Front-loaded, no unnecessary words.
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?
Tool has output schema (not shown), so no need to explain return values. Description covers purpose, usage, and parameter semantics fully for a simple 1-param tool with well-known siblings.
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 has 0% coverage for parameter 'entity', but description explains it is for one entity and gives examples ('Users', 'TimeEntries'), adding essential context beyond the schema.
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?
Description states verb 'Get' and resource 'fields, types and navigation properties' for a Timetta entity, with examples 'Users', 'TimeEntries'. Clearly distinguishes from siblings: list_entities lists entities, query_odata queries data.
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?
Explicitly says 'Call this before query_odata to learn real field names.' Provides clear when-to-use and implied when-not-to (for listing or querying). No exclusions needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_entitiesA
List the queryable Timetta OData entities (EntitySet names).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations exist, so the description carries the burden. It is adequate (read-only listing) but does not explicitly confirm read-only or discuss auth or side effects.
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, no filler, clear and front-loaded. Every word adds value.
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?
Tool is simple with output schema provided. Description fully captures the necessary context for an AI agent to understand the tool's purpose.
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?
With zero parameters, baseline is 4. The description adds no parameter info, which is acceptable since none exist.
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 specific verb 'List' and resource 'queryable Timetta OData entities (EntitySet names)', clearly distinguishing it from siblings like get_entity_schema and query_odata.
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 implies usage for discovering available entities but does not explicitly state when to use versus alternatives or provide contextual exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
query_odataA
Query a Timetta OData entity.
Args use OData semantics ($filter, $select, $expand, $orderby, $top, $skip) without the leading '$'. Example: entity='TimeEntries', filter='Date ge 2024-01-01', expand='Project,User', select='Date,Hours'. top defaults to 50 and is capped at 200; use skip to paginate. Returns a JSON array of rows, or 'Error: ...' on failure.
| Name | Required | Description | Default |
|---|---|---|---|
| entity | Yes | ||
| filter | No | ||
| select | No | ||
| expand | No | ||
| orderby | No | ||
| top | No | ||
| skip | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
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. It discloses return format (JSON array or error), default top (50), cap (200), and pagination via skip, which is sufficient for a query 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 concise (a few sentences) and well-structured, with an example embedded. Every sentence adds value 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 complexity (7 parameters, output schema present but not shown), the description covers key aspects: entity, filtering, selection, expansion, ordering, top cap, pagination. It may omit some edge cases but is largely complete.
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?
With 0% schema coverage, the description adds substantial value by explaining OData semantics, omitting the '$' prefix, providing an example, and detailing the top default and cap. This compensates for the lack of schema descriptions.
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 'Query a Timetta OData entity' with a specific verb and resource, and distinguishes from sibling tools (get_entity_schema, list_entities) by focusing on data retrieval.
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 a clear usage pattern with OData semantics and an example, but does not explicitly state when not to use this tool or mention alternative tools for different scenarios.
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.
3 tool updates
v0.1.0- First observed
get_entity_schema - First observed
list_entities - First observed
query_odata
TDQS
Each tool has a clearly distinct purpose: listing entities, retrieving schema for a specific entity, and querying data. No overlap or ambiguity.
All tools follow a consistent verb_noun pattern in snake_case: get_entity_schema, list_entities, query_odata. The pattern is uniform and predictable.
Three tools is minimal but fits the focused scope of exploring and querying Timetta OData. It is not overly sparse for a read-only adapter; could potentially include more but earns its place.
The tool set covers the essential read operations: listing available entities, understanding their schema, and querying with rich OData semantics. For a read-only interface, there are no obvious gaps; write operations are likely out of scope.
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
Official Microsoft MCP Server to query Microsoft Entra data using natural language
Governed data discovery, exact queries, decisions, simulations, and runtime utilities over MCP.
MCP server for searching Airweave collections with natural language queries.
MCP server for querying and analyzing data from ad platforms, analytics tools, and spreadsheets
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceAn MCP Server that enables natural language interaction with the Open Policy Agent REST API, allowing users to manage policies, decisions, and data through conversational interfaces.1-
- FlicenseNot gradedqualityDmaintenanceMCP server providing a single query tool to execute SQL against GetDot Database, enabling schema discovery, data loading, and querying via natural language.-
- AlicenseBqualityCmaintenanceMCP server enabling natural language interaction with Hubstaff data, including organizations, projects, members, tasks, and tracked-time activities.10MIT
- FlicenseNot gradedqualityCmaintenanceAn MCP server for OData v4 endpoints, especially Microsoft Dataverse/Dynamics 365, enabling authentication, schema discovery, querying, CRUD, and more via natural language.-
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/sh1rokovs/timetta-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server