@starascendin/lifeos-mcp 0.3.4 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/build-info.d.ts +2 -2
- package/dist/build-info.js +2 -2
- package/dist/index.js +288 -1
- package/package.json +1 -1
package/dist/build-info.d.ts
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export declare const VERSION = "0.
|
|
2
|
-
export declare const BUILD_TIME = "2026-
|
|
1
|
+
export declare const VERSION = "0.4.1";
|
|
2
|
+
export declare const BUILD_TIME = "2026-02-03T17:44:02.201Z";
|
package/dist/build-info.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
1
|
// AUTO-GENERATED — do not edit. Regenerated on every build.
|
|
2
|
-
export const VERSION = "0.
|
|
3
|
-
export const BUILD_TIME = "2026-
|
|
2
|
+
export const VERSION = "0.4.1";
|
|
3
|
+
export const BUILD_TIME = "2026-02-03T17:44:02.201Z";
|
package/dist/index.js
CHANGED
|
@@ -19,7 +19,7 @@ import { Command } from "commander";
|
|
|
19
19
|
import { VERSION, BUILD_TIME } from "./build-info.js";
|
|
20
20
|
import { Server } from "@modelcontextprotocol/sdk/server/index.js";
|
|
21
21
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
22
|
-
import { CallToolRequestSchema, ListToolsRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
22
|
+
import { CallToolRequestSchema, ListToolsRequestSchema, ListPromptsRequestSchema, GetPromptRequestSchema, } from "@modelcontextprotocol/sdk/types.js";
|
|
23
23
|
// Parse CLI arguments
|
|
24
24
|
const program = new Command();
|
|
25
25
|
program
|
|
@@ -1576,6 +1576,274 @@ const TOOLS = [
|
|
|
1576
1576
|
},
|
|
1577
1577
|
},
|
|
1578
1578
|
];
|
|
1579
|
+
// Prompt definitions — workflow-level skills that chain multiple tools
|
|
1580
|
+
const PROMPTS = [
|
|
1581
|
+
{
|
|
1582
|
+
name: "daily-standup",
|
|
1583
|
+
description: "Get daily standup briefing: agenda, tasks due today, sprint progress.",
|
|
1584
|
+
arguments: [
|
|
1585
|
+
{
|
|
1586
|
+
name: "date",
|
|
1587
|
+
description: "Specific date in ISO format (optional, defaults to today)",
|
|
1588
|
+
required: false,
|
|
1589
|
+
},
|
|
1590
|
+
],
|
|
1591
|
+
},
|
|
1592
|
+
{
|
|
1593
|
+
name: "weekly-review",
|
|
1594
|
+
description: "Run weekly review: completed work, in-progress items, sprint health, blockers.",
|
|
1595
|
+
arguments: [
|
|
1596
|
+
{
|
|
1597
|
+
name: "date",
|
|
1598
|
+
description: "Week start date in ISO format (optional, defaults to this week)",
|
|
1599
|
+
required: false,
|
|
1600
|
+
},
|
|
1601
|
+
],
|
|
1602
|
+
},
|
|
1603
|
+
{
|
|
1604
|
+
name: "sprint-plan",
|
|
1605
|
+
description: "Plan the current sprint: review backlog, assign tasks to cycle, check capacity.",
|
|
1606
|
+
arguments: [
|
|
1607
|
+
{
|
|
1608
|
+
name: "notes",
|
|
1609
|
+
description: "Additional context or specific tasks to include (optional)",
|
|
1610
|
+
required: false,
|
|
1611
|
+
},
|
|
1612
|
+
],
|
|
1613
|
+
},
|
|
1614
|
+
{
|
|
1615
|
+
name: "contact-lookup",
|
|
1616
|
+
description: "Full contact dossier: profile, AI insights, meetings, messages, voice memos.",
|
|
1617
|
+
arguments: [
|
|
1618
|
+
{
|
|
1619
|
+
name: "name",
|
|
1620
|
+
description: "Person's name to look up (required)",
|
|
1621
|
+
required: true,
|
|
1622
|
+
},
|
|
1623
|
+
],
|
|
1624
|
+
},
|
|
1625
|
+
{
|
|
1626
|
+
name: "client-brief",
|
|
1627
|
+
description: "Full client briefing: projects, phases, completion stats, recent communications.",
|
|
1628
|
+
arguments: [
|
|
1629
|
+
{
|
|
1630
|
+
name: "client",
|
|
1631
|
+
description: "Client name or ID (required)",
|
|
1632
|
+
required: true,
|
|
1633
|
+
},
|
|
1634
|
+
],
|
|
1635
|
+
},
|
|
1636
|
+
{
|
|
1637
|
+
name: "project-status",
|
|
1638
|
+
description: "Project status report: phases, task breakdown, blockers, urgent items.",
|
|
1639
|
+
arguments: [
|
|
1640
|
+
{
|
|
1641
|
+
name: "project",
|
|
1642
|
+
description: "Project key like 'ACME' or project name (required)",
|
|
1643
|
+
required: true,
|
|
1644
|
+
},
|
|
1645
|
+
],
|
|
1646
|
+
},
|
|
1647
|
+
{
|
|
1648
|
+
name: "capture",
|
|
1649
|
+
description: "Quick capture a thought, task, or note. Auto-routes to task or note based on content.",
|
|
1650
|
+
arguments: [
|
|
1651
|
+
{
|
|
1652
|
+
name: "input",
|
|
1653
|
+
description: "What to capture — a task, idea, or note (required)",
|
|
1654
|
+
required: true,
|
|
1655
|
+
},
|
|
1656
|
+
],
|
|
1657
|
+
},
|
|
1658
|
+
{
|
|
1659
|
+
name: "meeting-prep",
|
|
1660
|
+
description: "Prepare for a meeting: contact dossier, past meetings, recent messages, open items.",
|
|
1661
|
+
arguments: [
|
|
1662
|
+
{
|
|
1663
|
+
name: "name",
|
|
1664
|
+
description: "Person's name to prep for (required)",
|
|
1665
|
+
required: true,
|
|
1666
|
+
},
|
|
1667
|
+
],
|
|
1668
|
+
},
|
|
1669
|
+
];
|
|
1670
|
+
// Prompt message templates keyed by prompt name
|
|
1671
|
+
const PROMPT_MESSAGES = {
|
|
1672
|
+
"daily-standup": (args) => {
|
|
1673
|
+
const dateClause = args.date ? `Use date: ${args.date}` : "Use today's date.";
|
|
1674
|
+
return [{
|
|
1675
|
+
role: "user",
|
|
1676
|
+
content: {
|
|
1677
|
+
type: "text",
|
|
1678
|
+
text: `Get my daily standup briefing. Use the LifeOS MCP tools to gather:
|
|
1679
|
+
|
|
1680
|
+
1. Call get_daily_agenda for today's agenda (tasks due today, calendar events, top priorities)
|
|
1681
|
+
2. Call get_todays_tasks for today's task list
|
|
1682
|
+
3. Call get_current_cycle for current sprint progress and stats
|
|
1683
|
+
|
|
1684
|
+
${dateClause}
|
|
1685
|
+
|
|
1686
|
+
Summarize in a concise standup format:
|
|
1687
|
+
- **Today's Focus**: Top 3 things to focus on
|
|
1688
|
+
- **Tasks Due**: List tasks due today with priority
|
|
1689
|
+
- **Sprint Progress**: Cycle completion % and key stats
|
|
1690
|
+
- **Calendar**: Any meetings or events today
|
|
1691
|
+
|
|
1692
|
+
Keep it short and actionable.`,
|
|
1693
|
+
},
|
|
1694
|
+
}];
|
|
1695
|
+
},
|
|
1696
|
+
"weekly-review": (args) => {
|
|
1697
|
+
const dateClause = args.date ? `Use week start date: ${args.date}` : "Use this week.";
|
|
1698
|
+
return [{
|
|
1699
|
+
role: "user",
|
|
1700
|
+
content: {
|
|
1701
|
+
type: "text",
|
|
1702
|
+
text: `Run my weekly review. Use the LifeOS MCP tools to gather:
|
|
1703
|
+
|
|
1704
|
+
1. Call get_weekly_agenda for this week's agenda and AI summary
|
|
1705
|
+
2. Call get_current_cycle for sprint progress
|
|
1706
|
+
3. Call get_tasks with status "done" to see what was completed
|
|
1707
|
+
4. Call get_tasks with status "in_progress" to see what's still in flight
|
|
1708
|
+
5. Call get_tasks with status "todo" to see upcoming work
|
|
1709
|
+
|
|
1710
|
+
${dateClause}
|
|
1711
|
+
|
|
1712
|
+
Present a weekly review:
|
|
1713
|
+
- **Completed**: What got done this week
|
|
1714
|
+
- **In Progress**: What's still being worked on
|
|
1715
|
+
- **Sprint Health**: Cycle progress, burndown status
|
|
1716
|
+
- **Blockers**: Anything overdue or stuck
|
|
1717
|
+
- **Next Week**: Key items to tackle`,
|
|
1718
|
+
},
|
|
1719
|
+
}];
|
|
1720
|
+
},
|
|
1721
|
+
"sprint-plan": (args) => {
|
|
1722
|
+
const notesClause = args.notes ? `Additional context: ${args.notes}` : "";
|
|
1723
|
+
return [{
|
|
1724
|
+
role: "user",
|
|
1725
|
+
content: {
|
|
1726
|
+
type: "text",
|
|
1727
|
+
text: `Help me plan my sprint. Use the LifeOS MCP tools:
|
|
1728
|
+
|
|
1729
|
+
1. Call get_current_cycle to see the active sprint and its current state
|
|
1730
|
+
2. Call get_tasks with status "backlog" to see unplanned work
|
|
1731
|
+
3. Call get_tasks with status "todo" to see already planned work
|
|
1732
|
+
4. Call get_projects with status "in_progress" to see active projects
|
|
1733
|
+
|
|
1734
|
+
${notesClause}
|
|
1735
|
+
|
|
1736
|
+
Then help me plan:
|
|
1737
|
+
- Show current sprint capacity (what's already assigned vs. remaining)
|
|
1738
|
+
- List backlog items by priority, grouped by project
|
|
1739
|
+
- Suggest which backlog items to pull into the sprint based on priority
|
|
1740
|
+
- If I provide specific tasks, create issues and assign them to the current cycle
|
|
1741
|
+
|
|
1742
|
+
Ask me to confirm before creating or assigning any issues.`,
|
|
1743
|
+
},
|
|
1744
|
+
}];
|
|
1745
|
+
},
|
|
1746
|
+
"contact-lookup": (args) => [{
|
|
1747
|
+
role: "user",
|
|
1748
|
+
content: {
|
|
1749
|
+
type: "text",
|
|
1750
|
+
text: `Look up everything about a contact. Use the LifeOS MCP tools:
|
|
1751
|
+
|
|
1752
|
+
1. Call get_contact_dossier with nameQuery "${args.name}" to get the full profile
|
|
1753
|
+
- This returns: person info, AI profile, Beeper threads, Granola meetings (with AI notes and calendar events), and voice memos
|
|
1754
|
+
|
|
1755
|
+
Present the dossier in a structured format:
|
|
1756
|
+
- **Profile**: Name, relationship type, contact info, notes
|
|
1757
|
+
- **AI Insights**: Communication style, personality, relationship tips (if available)
|
|
1758
|
+
- **Recent Interactions**: Last few voice memos, meetings, and messages — sorted by recency
|
|
1759
|
+
- **Meeting History**: Granola/Fathom meetings with key takeaways
|
|
1760
|
+
- **Chat Threads**: Beeper conversation threads linked to this person`,
|
|
1761
|
+
},
|
|
1762
|
+
}],
|
|
1763
|
+
"client-brief": (args) => [{
|
|
1764
|
+
role: "user",
|
|
1765
|
+
content: {
|
|
1766
|
+
type: "text",
|
|
1767
|
+
text: `Get a full client briefing for "${args.client}". Use the LifeOS MCP tools:
|
|
1768
|
+
|
|
1769
|
+
1. Call get_clients to find the matching client
|
|
1770
|
+
2. Call get_client with the client ID for full details
|
|
1771
|
+
3. Call get_projects_for_client to see all their projects and completion stats
|
|
1772
|
+
4. Call get_beeper_threads_for_client to see linked chat threads
|
|
1773
|
+
|
|
1774
|
+
For each active project, also call get_phases to see phase breakdown.
|
|
1775
|
+
|
|
1776
|
+
Present as a client brief:
|
|
1777
|
+
- **Client Overview**: Name, status, description
|
|
1778
|
+
- **Projects**: Each project with status, health, priority, and phase breakdown
|
|
1779
|
+
- **Completion Stats**: Issues done vs total across all projects
|
|
1780
|
+
- **Recent Comms**: Latest Beeper thread activity
|
|
1781
|
+
- **Action Items**: Any overdue or urgent tasks for this client`,
|
|
1782
|
+
},
|
|
1783
|
+
}],
|
|
1784
|
+
"project-status": (args) => [{
|
|
1785
|
+
role: "user",
|
|
1786
|
+
content: {
|
|
1787
|
+
type: "text",
|
|
1788
|
+
text: `Get project status for "${args.project}". Use the LifeOS MCP tools:
|
|
1789
|
+
|
|
1790
|
+
1. Call get_project with the project key/ID
|
|
1791
|
+
2. Call get_phases for the project to see phase breakdown
|
|
1792
|
+
3. Call get_tasks filtered by the project ID to see all issues
|
|
1793
|
+
|
|
1794
|
+
Present a project status report:
|
|
1795
|
+
- **Overview**: Name, status, health, priority, client (if linked)
|
|
1796
|
+
- **Phases**: Each phase with status and issue counts
|
|
1797
|
+
- **Task Breakdown**: Count by status (backlog / todo / in_progress / in_review / done)
|
|
1798
|
+
- **Urgent/Overdue**: Any urgent or overdue tasks
|
|
1799
|
+
- **In Progress**: What's actively being worked on
|
|
1800
|
+
- **Blockers**: Anything that looks stuck`,
|
|
1801
|
+
},
|
|
1802
|
+
}],
|
|
1803
|
+
"capture": (args) => [{
|
|
1804
|
+
role: "user",
|
|
1805
|
+
content: {
|
|
1806
|
+
type: "text",
|
|
1807
|
+
text: `Quick capture: "${args.input}"
|
|
1808
|
+
|
|
1809
|
+
Analyze the input and determine what type of capture this is:
|
|
1810
|
+
|
|
1811
|
+
**If it's a task/action item** (contains action verbs, deadlines, assignments):
|
|
1812
|
+
- Use create_issue from LifeOS MCP tools
|
|
1813
|
+
- Infer priority from urgency cues (e.g., "urgent", "ASAP" = urgent; "soon" = high; default = medium)
|
|
1814
|
+
- If a project is mentioned, look it up with get_projects and assign it
|
|
1815
|
+
- If a due date is mentioned, parse and set it
|
|
1816
|
+
|
|
1817
|
+
**If it's a thought/note** (observations, ideas, reminders):
|
|
1818
|
+
- Use create_quick_note from LifeOS MCP tools
|
|
1819
|
+
- Extract tags from context (e.g., topic keywords)
|
|
1820
|
+
|
|
1821
|
+
**If ambiguous**, default to creating a quick note.
|
|
1822
|
+
|
|
1823
|
+
After creating, confirm what was captured with the ID/identifier.`,
|
|
1824
|
+
},
|
|
1825
|
+
}],
|
|
1826
|
+
"meeting-prep": (args) => [{
|
|
1827
|
+
role: "user",
|
|
1828
|
+
content: {
|
|
1829
|
+
type: "text",
|
|
1830
|
+
text: `Prepare for a meeting with "${args.name}". Use the LifeOS MCP tools:
|
|
1831
|
+
|
|
1832
|
+
1. Call get_contact_dossier with nameQuery "${args.name}" for full context
|
|
1833
|
+
2. Call get_granola_meetings_for_person for past meeting notes
|
|
1834
|
+
3. If person is linked to a client, call get_projects_for_client for project status
|
|
1835
|
+
4. Call get_beeper_threads_for_person and for the most recent thread, call get_beeper_thread_messages to see latest messages
|
|
1836
|
+
|
|
1837
|
+
Compile a meeting prep brief:
|
|
1838
|
+
- **About**: Who they are, relationship type, communication style (from AI profile)
|
|
1839
|
+
- **Last Interaction**: When you last met/talked and what was discussed
|
|
1840
|
+
- **Open Items**: Any action items or tasks related to them or their projects
|
|
1841
|
+
- **Recent Messages**: Key points from recent Beeper conversations
|
|
1842
|
+
- **Past Meetings**: Summary of last 3 meetings with key decisions/takeaways
|
|
1843
|
+
- **Suggested Talking Points**: Based on open items and recent context`,
|
|
1844
|
+
},
|
|
1845
|
+
}],
|
|
1846
|
+
};
|
|
1579
1847
|
// Configuration: CLI flags take precedence over env vars
|
|
1580
1848
|
// NOTE: HTTP routes are served from .convex.site, NOT .convex.cloud
|
|
1581
1849
|
const CONVEX_URL = options.url || process.env.CONVEX_URL;
|
|
@@ -1637,12 +1905,31 @@ const server = new Server({
|
|
|
1637
1905
|
}, {
|
|
1638
1906
|
capabilities: {
|
|
1639
1907
|
tools: {},
|
|
1908
|
+
prompts: {},
|
|
1640
1909
|
},
|
|
1641
1910
|
});
|
|
1642
1911
|
// Handle list tools request
|
|
1643
1912
|
server.setRequestHandler(ListToolsRequestSchema, async () => {
|
|
1644
1913
|
return { tools: TOOLS };
|
|
1645
1914
|
});
|
|
1915
|
+
// Handle list prompts request
|
|
1916
|
+
server.setRequestHandler(ListPromptsRequestSchema, async () => {
|
|
1917
|
+
return { prompts: PROMPTS };
|
|
1918
|
+
});
|
|
1919
|
+
// Handle get prompt request
|
|
1920
|
+
server.setRequestHandler(GetPromptRequestSchema, async (request) => {
|
|
1921
|
+
const { name, arguments: args } = request.params;
|
|
1922
|
+
const messageBuilder = PROMPT_MESSAGES[name];
|
|
1923
|
+
if (!messageBuilder) {
|
|
1924
|
+
throw new Error(`Unknown prompt: ${name}`);
|
|
1925
|
+
}
|
|
1926
|
+
const prompt = PROMPTS.find((p) => p.name === name);
|
|
1927
|
+
const messages = messageBuilder(args || {});
|
|
1928
|
+
return {
|
|
1929
|
+
description: prompt?.description,
|
|
1930
|
+
messages,
|
|
1931
|
+
};
|
|
1932
|
+
});
|
|
1646
1933
|
// Handle tool calls
|
|
1647
1934
|
server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
1648
1935
|
const { name, arguments: args } = request.params;
|
package/package.json
CHANGED