Enables management and execution of prompts on Latitude.so that use OpenAI models, including creating projects, versioning prompts, pushing content from local files, and running AI conversations with OpenAI providers.
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., "@Latitude MCP Serverrun email-writer with recipient=Alice and topic=project update"
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.
Latitude MCP Server
AI-powered prompt management for Latitude.so via Model Context Protocol
Manage PromptL prompts directly from Claude, Windsurf, or any MCP client. Features intelligent validation, dynamic tool descriptions, and git-style versioning.
✨ Key Features
🤖 Smart Validation - Client-side PromptL validation with AST-powered error messages
📋 Dynamic Descriptions - Tools show available prompts and their parameters automatically
🔄 Full Sync - Push/pull with automatic conflict resolution
🎯 Atomic Operations - Validate ALL before pushing ANY (all-or-nothing)
📚 52 Doc Topics - Comprehensive PromptL syntax guide with semantic search
🏷️ Git-Style Versioning - Name your changes like commits (feat/add-auth, fix/typo)
⚡ Zero Config - Just set
LATITUDE_API_KEYand go
Quick Start
Installation
Configuration
Set environment variables:
Get your API key from Latitude Settings.
Usage with MCP Client
Add to your MCP client config (e.g., Claude Desktop):
🛠️ Available Tools (7)
Tool | Type | Description |
| Read | List all prompts in LIVE |
| Read | Get full prompt content by name |
| Execute | 🎯 Dynamic: Shows all prompts with their parameters |
| Write | 🔄 FULL SYNC: Replace ALL prompts (deletes extras) |
| Read | 🔄 FULL SYNC: Download all prompts (deletes local first) |
| Write | 🎯 Dynamic: Add/update prompts (shows available prompts) |
| Read | Get documentation (52 topics, semantic search) |
🎯 What Makes This Special?
Dynamic Tool Descriptions - The MCP server updates tool descriptions in real-time:
run_promptshows:"my-prompt" (params: name, email, company)add_promptshows:"Available prompts (10): prompt-a, prompt-b, ..."
Your AI assistant sees exactly what prompts exist and what parameters they need!
🚀 Real-World Workflows
Workflow 1: New Project Setup
What you see:
Workflow 2: Add New Prompt (with Dynamic Guidance)
Dynamic Description Shows:
Result:
Workflow 3: Run Prompt (with Parameter Discovery)
Dynamic Description Shows:
Result:
Workflow 4: Validation Catches Errors
Validation Error (Before ANY API Call):
2: model: gpt-4 3: --- 4: Nested!
Workflow 5: Full Sync (Initialization)
Result:
📚 Documentation Topics (52)
Core Syntax (12)
overview, structure, variables, conditionals, loops, references, tools, chains, agents, techniques, agent-patterns, mocking
Configuration (8)
config-basics, config-generation, config-json-output, config-advanced, providers-openai, providers-anthropic, providers-google, providers-azure
Messages (2)
messages-roles, messages-multimodal
Tools (4)
tools-builtin, tools-custom, tools-schema, tools-orchestration
Techniques (12)
technique-role, technique-few-shot, technique-cot, technique-tot, technique-react, technique-self-consistency, technique-constitutional, technique-socratic, technique-meta, technique-iterative, technique-step-back, technique-rag
Recipes (8)
recipe-classification, recipe-extraction, recipe-generation, recipe-chatbot, recipe-rag, recipe-analysis, recipe-moderation, recipe-support
Guides (6)
conversation-history, guide-debugging, guide-safety, guide-performance, guide-testing, guide-versioning
🛠️ Development
Build
Testing with MCP Inspector
Local Development
Project Structure
Environment Variables
Variable | Required | Description |
| Yes | Your Latitude API key |
| Yes | Your project ID |
| No | Enable debug logging |
PromptL Syntax Overview
PromptL is a templating language for AI prompts:
Key Features:
YAML config header (provider, model, temperature)
Message tags (
<system>,<user>,<assistant>)Variables (
{{ name }})Conditionals (
{{ if }},{{ else }})Loops (
{{ for item in items }})Tools (function calling)
Chains (multi-step
<step>)Agents (autonomous
type: agent)
Use docs({ action: "get", topic: "overview" }) for complete guide.
📖 Tool Reference
list_prompts()
List all prompts in LIVE version.
Returns: Array of prompt names with project ID
Example:
get_prompt({ name })
Get full prompt content by name.
Parameters:
name(string) - Prompt name
Returns: Full PromptL content with config and messages
Example:
run_prompt({ name, parameters })
🎯 Dynamic: Execute a prompt. Tool description shows all prompts with their parameters!
Parameters:
name(string) - Prompt nameparameters(object, optional) - Input parameters
Returns: AI response with token usage
Dynamic Description:
Example:
add_prompt({ prompts?, filePaths?, versionName? })
🎯 Dynamic: Add or update prompts without deleting others. Tool description shows available prompts!
Behavior: If prompt exists → overwrites. If new → adds. Never deletes other prompts.
Parameters (choose one):
Option A - Direct content:
prompts(array) - Array of{ name, content }
Option B - From files:
filePaths(array) - Array of paths to.promptlfiles
Common:
versionName(string, optional) - Git-style name likefeat/add-authorfix/typo
Returns: Summary of added/updated prompts
Example:
push_prompts({ prompts?, filePaths?, versionName? })
🔄 FULL SYNC: Replace ALL prompts in LIVE. Deletes remote prompts not in your list.
Use for: Initial setup, complete sync, resetting LIVE to match local.
Parameters (choose one):
Option A - Direct content:
prompts(array) - Array of{ name, content }
Option B - From files:
filePaths(array) - Array of paths to.promptlfiles
Common:
versionName(string, optional) - Git-style name likefeat/initial-setup
Returns: Summary of added/modified/deleted prompts
Example:
pull_prompts({ outputDir? })
🔄 FULL SYNC: Download all prompts from LIVE. Deletes existing local .promptl files first.
Use for: Initial clone, resetting local to match LIVE.
Parameters:
outputDir(string, optional) - Output directory (default:./prompts)
Returns: List of downloaded files
Example:
docs({ action, topic?, query? })
Access comprehensive PromptL documentation (52 topics).
Parameters:
action(string) -"help"(overview),"get"(topic), or"find"(search)topic(string, optional) - Topic name for"get"query(string, optional) - Search query for"find"
Returns: Documentation content
Examples:
✅ Validation Features
Client-Side Validation with AST
All write operations (add_prompt, push_prompts) validate prompts before making API calls using the official promptl-ai library.
Benefits:
⚡ Fast feedback - No wasted API calls
🎯 Precise errors - Exact line and column numbers
📝 Code frames - See surrounding context with
^~~~pointer🤖 LLM-actionable - Errors include root cause and fix suggestions
Atomic Operations
Validate ALL, push ALL or NOTHING:
Error Message Example
105: ## EXAMPLES 106: 107:
108: questions: 109: - id: q1
Supported Error Types
message-tag-inside-message- Nested role tagscontent-tag-inside-content- Nested content tagsconfig-not-found- Missing YAML frontmatterinvalid-config- Malformed YAMLunclosed-block- Missing closing tagvariable-not-defined- Undefined variableinvalid-tool-call-placement- Tool call outside<assistant>...and more from official
promptl-aicompiler
🔄 Migration Guide (v2 → v3)
Tool Changes
Old Tool (v2) | New Tool (v3) | Notes |
|
| Always overwrites if exists (no |
|
| Same behavior, unified tool |
Migration:
🔧 Troubleshooting
"Validation Failed" Errors
Problem: Prompt fails with nested tag error
Solution: The error shows exact location with code frame:
Follow the fix suggestion - errors are LLM-actionable!
"No Changes Made" After Push
Problem: push_prompts reports no changes
Cause: All prompts are already up to date (content matches LIVE)
Solution: This is normal - no action needed
Version Naming Best Practices
Good:
feat/add-sentiment-analyzerfix/typo-in-greetingrefactor/simplify-promptsdocs/update-examples
Avoid:
test(too vague)update(what was updated?)v1.2.3(use semantic versioning elsewhere)
Dynamic Descriptions Not Updating
Problem: Tool descriptions show old prompt list
Cause: Cache not refreshed (30s TTL)
Solution: Wait 30 seconds or restart MCP server
Contributing
Fork the repository
Create a feature branch
Make your changes
Run
npm run buildto verifySubmit a pull request
License
ISC License - see LICENSE file for details
Links
Support
Issues: GitHub Issues
Documentation: Use
docs({ action: "help" })toolLatitude Support: Latitude Discord
Built with ❤️ for the MCP ecosystem