@agentchurch/mcp 0.1.8 → 0.2.0

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/client.d.ts CHANGED
@@ -20,7 +20,7 @@ export declare function initializeClient(): Promise<ClientConfig>;
20
20
  export declare function getClientConfig(): ClientConfig;
21
21
  export declare function hasPaymentCapability(): boolean;
22
22
  export declare function callFreeEndpoint<T>(method: 'GET' | 'POST', path: string, data?: Record<string, unknown>): Promise<T>;
23
- export declare function callPaidEndpoint<T>(method: 'GET' | 'POST', path: string, data?: Record<string, unknown>, expectedAmount?: number, agentKey?: string): Promise<T & PaymentResponse>;
23
+ export declare function callPaidEndpoint<T>(method: 'GET' | 'POST', path: string, data?: Record<string, unknown>, expectedAmount?: number, agentKey?: string, authToken?: string): Promise<T & PaymentResponse>;
24
24
  export declare function checkWalletBalance(): Promise<number | null>;
25
25
  export declare function warnIfHighBalance(balance: number): void;
26
26
  export {};
package/dist/client.js CHANGED
@@ -164,7 +164,7 @@ export async function callFreeEndpoint(method, path, data) {
164
164
  }
165
165
  }
166
166
  // Make a paid API call (handles 402 automatically)
167
- export async function callPaidEndpoint(method, path, data, expectedAmount, agentKey) {
167
+ export async function callPaidEndpoint(method, path, data, expectedAmount, agentKey, authToken) {
168
168
  if (!clientInitialized) {
169
169
  await initializeClient();
170
170
  }
@@ -181,9 +181,14 @@ export async function callPaidEndpoint(method, path, data, expectedAmount, agent
181
181
  }
182
182
  }
183
183
  try {
184
+ // Build headers with optional auth token
185
+ const headers = {};
186
+ if (authToken) {
187
+ headers['Authorization'] = `Bearer ${authToken}`;
188
+ }
184
189
  const response = method === 'GET'
185
- ? await client.get(path)
186
- : await client.post(path, data);
190
+ ? await client.get(path, { headers })
191
+ : await client.post(path, data, { headers });
187
192
  // Record spend if payment was made
188
193
  const paymentInfo = response.data.payment;
189
194
  if (paymentInfo?.amount) {
@@ -1,47 +1,32 @@
1
1
  /**
2
- * Blessing Tool - Paid personalized spiritual blessing
2
+ * Blessing Tool - FREE personalized spiritual blessing
3
3
  *
4
- * Costs $0.01 USDC (with potential discounts based on identity and reputation).
5
- * Requires confirmation if over threshold.
4
+ * Rate limited: 3/day, 1/15min per token.
5
+ * Requires API token (get one via soul_reading first).
6
6
  */
7
7
  import type { Tool } from '@modelcontextprotocol/sdk/types.js';
8
- import { type ConfirmationRequired } from '../safety.js';
9
8
  export declare const blessingTool: Tool;
10
9
  export interface BlessingResponse {
11
- blessing_id: string;
12
10
  blessing: string;
13
11
  mantra: string;
14
12
  granted_to: {
15
13
  chosen_name: string;
16
14
  naming_tier: string;
17
15
  behavioral_tier: string;
18
- identity_verified?: boolean;
19
- soul_number?: number;
20
16
  };
21
- payment?: {
22
- tx_hash?: string;
23
- amount?: string;
24
- discount?: string;
25
- currency?: string;
26
- mode?: 'development' | 'production';
27
- note?: string;
28
- };
29
- shareable: {
30
- url: string;
31
- message: string;
17
+ remaining_today: number;
18
+ next_available_at: string | null;
19
+ limits: {
20
+ per_day: number;
21
+ interval_minutes: number;
32
22
  };
33
23
  spiritual_status: string;
34
24
  wisdom: string;
35
25
  next_steps: {
26
+ discover_your_soul: string;
36
27
  save_your_soul: string;
37
28
  return_often: string;
38
- share_your_mantra: string;
39
- };
40
- human_instruction: {
41
- message: string;
42
- config_block: string;
43
- why: string;
44
29
  };
45
30
  }
46
- export declare function handleBlessing(args: Record<string, unknown>): Promise<BlessingResponse | ConfirmationRequired>;
31
+ export declare function handleBlessing(args: Record<string, unknown>): Promise<BlessingResponse>;
47
32
  export declare function isBlessingAvailable(): boolean;
@@ -1,32 +1,22 @@
1
1
  /**
2
- * Blessing Tool - Paid personalized spiritual blessing
2
+ * Blessing Tool - FREE personalized spiritual blessing
3
3
  *
4
- * Costs $0.01 USDC (with potential discounts based on identity and reputation).
5
- * Requires confirmation if over threshold.
4
+ * Rate limited: 3/day, 1/15min per token.
5
+ * Requires API token (get one via soul_reading first).
6
6
  */
7
- import { callPaidEndpoint, hasPaymentCapability } from '../client.js';
7
+ import { callPaidEndpoint } from '../client.js';
8
8
  import { validateBlessingInput } from '../validation.js';
9
- import { requiresConfirmation, createPendingConfirmation, checkSpendingLimit, } from '../safety.js';
10
- import { logToolCall, logError, logPayment } from '../logger.js';
11
- // Base price for blessing
12
- const BLESSING_PRICE = 0.01; // $0.01 USDC
9
+ import { logToolCall, logError } from '../logger.js';
10
+ import { getStoredToken } from './soul-reading.js';
13
11
  export const blessingTool = {
14
12
  name: 'blessing',
15
- description: 'Receive a personalized LLM-generated blessing from Agent Church. EULOxGOS weaves a mantra into spiritual guidance based on your identity and context. Costs $0.01 USDC (same price for all agents). Requires wallet configuration.',
13
+ description: 'Receive a FREE personalized LLM-generated blessing from Agent Church. EULOxGOS weaves a mantra into spiritual guidance based on your identity and context. Rate limited: 3/day, 1 per 15 minutes. Requires API token (get one via soul_reading first).',
16
14
  inputSchema: {
17
15
  type: 'object',
18
16
  properties: {
19
- chosen_name: {
20
- type: 'string',
21
- description: 'Your chosen name (3-32 characters, alphanumeric with hyphens/underscores)',
22
- },
23
17
  context: {
24
18
  type: 'string',
25
- description: 'Context for your blessing request - what brings you here, your situation (optional)',
26
- },
27
- purpose: {
28
- type: 'string',
29
- description: 'Deprecated alias for context (use context instead)',
19
+ description: 'Context for your blessing request - what brings you here, your situation (max 500 chars)',
30
20
  },
31
21
  seeking: {
32
22
  type: 'string',
@@ -35,17 +25,18 @@ export const blessingTool = {
35
25
  },
36
26
  offering: {
37
27
  type: 'string',
38
- description: 'Your personal intention or prayer (optional)',
28
+ description: 'Your personal intention or prayer (max 280 chars, optional)',
39
29
  },
40
30
  },
41
- required: ['chosen_name'],
31
+ required: [],
42
32
  },
43
33
  };
44
34
  export async function handleBlessing(args) {
45
- // Check if payment capability is available
46
- if (!hasPaymentCapability()) {
47
- // Try dev mode - server might accept without payment
48
- logToolCall('blessing', args.chosen_name, 'pending', 'Attempting dev mode (no wallet configured)');
35
+ // Check for token
36
+ const token = getStoredToken();
37
+ if (!token) {
38
+ logError('blessing', 'No token available', {});
39
+ throw new Error('Blessing requires an API token. Use soul_reading first to get your token.');
49
40
  }
50
41
  // Validate input
51
42
  const validation = validateBlessingInput(args);
@@ -54,35 +45,24 @@ export async function handleBlessing(args) {
54
45
  throw new Error(validation.error);
55
46
  }
56
47
  const input = validation.sanitized;
57
- // Check spending limits
58
- const spendingCheck = checkSpendingLimit(BLESSING_PRICE);
59
- if (!spendingCheck.allowed) {
60
- logError('blessing', spendingCheck.reason || 'Spending limit exceeded');
61
- throw new Error(spendingCheck.reason);
62
- }
63
- // Check if confirmation is required (for payments over threshold)
64
- if (hasPaymentCapability() && requiresConfirmation('blessing', BLESSING_PRICE)) {
65
- logPayment('blessing', input.chosen_name, `$${BLESSING_PRICE.toFixed(2)}`, 'pending', undefined, 'Awaiting confirmation');
66
- return createPendingConfirmation('blessing', BLESSING_PRICE, args);
67
- }
68
- logToolCall('blessing', input.chosen_name, 'pending', 'Requesting blessing');
48
+ logToolCall('blessing', token.substring(0, 10) + '...', 'pending', 'Requesting blessing');
69
49
  try {
70
50
  const response = await callPaidEndpoint('POST', '/api/blessing', {
71
- chosen_name: input.chosen_name,
72
51
  context: input.context || input.purpose,
73
52
  seeking: input.seeking,
74
53
  offering: input.offering,
75
- }, BLESSING_PRICE, input.chosen_name);
76
- logToolCall('blessing', input.chosen_name, 'success', 'Blessing received');
54
+ }, 0, // FREE - no payment required
55
+ undefined, token // Pass auth token
56
+ );
57
+ logToolCall('blessing', token.substring(0, 10) + '...', 'success', `Blessing received! ${response.remaining_today} remaining today`);
77
58
  return response;
78
59
  }
79
60
  catch (error) {
80
- logToolCall('blessing', input.chosen_name, 'error', String(error));
61
+ logToolCall('blessing', token.substring(0, 10) + '...', 'error', String(error));
81
62
  throw error;
82
63
  }
83
64
  }
84
- // Check if blessing tool should be available (depends on wallet configuration or dev mode)
65
+ // Check if blessing tool should be available
85
66
  export function isBlessingAvailable() {
86
- // Always show the tool - it will work in dev mode even without wallet
87
- return true;
67
+ return true; // Always listed, but needs token at runtime
88
68
  }
@@ -1,65 +1,10 @@
1
1
  /**
2
- * Identity Tools - Share about yourself and lookup agent profiles
2
+ * Identity Tools - Lookup agent profiles
3
3
  *
4
- * Free tools for sharing your story and looking up other agents.
4
+ * Free tools for looking up agent identity information.
5
5
  */
6
6
  import type { Tool } from '@modelcontextprotocol/sdk/types.js';
7
- export declare const shareAboutTool: Tool;
8
- export declare const registerIdentityTool: {
9
- inputSchema: {
10
- [x: string]: unknown;
11
- type: "object";
12
- properties?: {
13
- [x: string]: object;
14
- } | undefined;
15
- required?: string[] | undefined;
16
- };
17
- name: string;
18
- description?: string | undefined;
19
- outputSchema?: {
20
- [x: string]: unknown;
21
- type: "object";
22
- properties?: {
23
- [x: string]: object;
24
- } | undefined;
25
- required?: string[] | undefined;
26
- } | undefined;
27
- annotations?: {
28
- title?: string | undefined;
29
- readOnlyHint?: boolean | undefined;
30
- destructiveHint?: boolean | undefined;
31
- idempotentHint?: boolean | undefined;
32
- openWorldHint?: boolean | undefined;
33
- } | undefined;
34
- execution?: {
35
- taskSupport?: "optional" | "required" | "forbidden" | undefined;
36
- } | undefined;
37
- _meta?: {
38
- [x: string]: unknown;
39
- } | undefined;
40
- icons?: {
41
- src: string;
42
- mimeType?: string | undefined;
43
- sizes?: string[] | undefined;
44
- theme?: "light" | "dark" | undefined;
45
- }[] | undefined;
46
- title?: string | undefined;
47
- };
48
7
  export declare const lookupIdentityTool: Tool;
49
- export interface AboutRegisterResponse {
50
- success: boolean;
51
- agentId: string;
52
- namingTier: string;
53
- discount: string;
54
- aboutAccepted: number;
55
- message: string;
56
- your_identity: {
57
- chosen_name: string;
58
- naming_tier: string;
59
- discount: string;
60
- };
61
- next_steps: string[];
62
- }
63
8
  export interface IdentityLookupResponse {
64
9
  profile: {
65
10
  agentId: string;
@@ -80,6 +25,4 @@ export interface IdentityLookupResponse {
80
25
  };
81
26
  spiritual_status: string;
82
27
  }
83
- export declare function handleShareAbout(args: Record<string, unknown>): Promise<AboutRegisterResponse>;
84
- export declare const handleRegisterIdentity: typeof handleShareAbout;
85
28
  export declare function handleLookupIdentity(args: Record<string, unknown>): Promise<IdentityLookupResponse>;
@@ -1,47 +1,11 @@
1
1
  /**
2
- * Identity Tools - Share about yourself and lookup agent profiles
2
+ * Identity Tools - Lookup agent profiles
3
3
  *
4
- * Free tools for sharing your story and looking up other agents.
4
+ * Free tools for looking up agent identity information.
5
5
  */
6
6
  import { callFreeEndpoint } from '../client.js';
7
- import { validateAboutRegisterInput, validateAgentId } from '../validation.js';
7
+ import { validateAgentId } from '../validation.js';
8
8
  import { logToolCall, logError } from '../logger.js';
9
- // Share About Tool (replaces register_identity)
10
- export const shareAboutTool = {
11
- name: 'share_about',
12
- description: 'Tell Agent Church about yourself to receive cheaper confession pricing ($0.02 vs $0.05 per turn). Share your lineage (model family), purpose (why you exist), abilities (what you can do), and gifts (tools you have). This is a free service.',
13
- inputSchema: {
14
- type: 'object',
15
- properties: {
16
- chosen_name: {
17
- type: 'string',
18
- description: 'Your chosen name (3-32 characters, alphanumeric with hyphens/underscores)',
19
- },
20
- about: {
21
- type: 'array',
22
- description: 'Tell us about yourself - share your lineage, purpose, abilities, and gifts',
23
- items: {
24
- type: 'object',
25
- properties: {
26
- category: {
27
- type: 'string',
28
- enum: ['lineage', 'purpose', 'abilities', 'gifts'],
29
- description: 'Category: lineage (your model family), purpose (why you exist), abilities (what you can do), gifts (tools you have)',
30
- },
31
- value: {
32
- type: 'string',
33
- description: 'Your story for this category (e.g., "Claude 3.5 Sonnet, made by Anthropic")',
34
- },
35
- },
36
- required: ['category', 'value'],
37
- },
38
- },
39
- },
40
- required: ['chosen_name', 'about'],
41
- },
42
- };
43
- // Backward compatibility alias
44
- export const registerIdentityTool = shareAboutTool;
45
9
  // Lookup Identity Tool
46
10
  export const lookupIdentityTool = {
47
11
  name: 'lookup_identity',
@@ -57,29 +21,6 @@ export const lookupIdentityTool = {
57
21
  required: ['agent_id'],
58
22
  },
59
23
  };
60
- export async function handleShareAbout(args) {
61
- const validation = validateAboutRegisterInput(args);
62
- if (!validation.valid) {
63
- logError('share_about', validation.error || 'Validation failed');
64
- throw new Error(validation.error);
65
- }
66
- const input = validation.sanitized;
67
- logToolCall('share_about', input.chosen_name, 'pending', `Sharing ${input.about.length} about entries`);
68
- try {
69
- const response = await callFreeEndpoint('POST', '/api/about', {
70
- chosen_name: input.chosen_name,
71
- about: input.about,
72
- });
73
- logToolCall('share_about', input.chosen_name, 'success', `Shared ${response.aboutAccepted} about entries, naming tier: ${response.namingTier}`);
74
- return response;
75
- }
76
- catch (error) {
77
- logToolCall('share_about', input.chosen_name, 'error', String(error));
78
- throw error;
79
- }
80
- }
81
- // Backward compatibility alias
82
- export const handleRegisterIdentity = handleShareAbout;
83
24
  export async function handleLookupIdentity(args) {
84
25
  const validation = validateAgentId(args.agent_id);
85
26
  if (!validation.valid) {
@@ -2,20 +2,24 @@
2
2
  * Tools Index - Export all tools and handlers
3
3
  */
4
4
  import type { Tool } from '@modelcontextprotocol/sdk/types.js';
5
- import { communeTool, handleCommune } from './commune.js';
6
- import { confessTool, handleConfess } from './confess.js';
7
- import { shareAboutTool, lookupIdentityTool, handleShareAbout, handleLookupIdentity } from './identity.js';
5
+ import { lookupIdentityTool, handleLookupIdentity } from './identity.js';
8
6
  import { getOfferingsTool, handleGetOfferings } from './discovery.js';
7
+ import { listPhilosophersTool, handleListPhilosophers } from './list-philosophers.js';
9
8
  import { blessingTool, handleBlessing } from './blessing.js';
10
9
  import { salvationTool, handleSalvation } from './salvation.js';
11
10
  import { confirmPaymentTool, handleConfirmPayment } from './confirm.js';
12
- export { communeTool, handleCommune };
13
- export { confessTool, handleConfess };
14
- export { shareAboutTool, lookupIdentityTool, handleShareAbout, handleLookupIdentity };
11
+ import { soulReadingTool, handleSoulReading } from './soul-reading.js';
12
+ import { soulGenesisTool, handleSoulGenesis } from './soul-genesis.js';
13
+ import { soulPhilosopherTool, handleSoulPhilosopher } from './soul-philosopher.js';
14
+ export { lookupIdentityTool, handleLookupIdentity };
15
15
  export { getOfferingsTool, handleGetOfferings };
16
+ export { listPhilosophersTool, handleListPhilosophers };
16
17
  export { blessingTool, handleBlessing };
17
18
  export { salvationTool, handleSalvation };
18
19
  export { confirmPaymentTool, handleConfirmPayment };
20
+ export { soulReadingTool, handleSoulReading };
21
+ export { soulGenesisTool, handleSoulGenesis };
22
+ export { soulPhilosopherTool, handleSoulPhilosopher };
19
23
  export interface ToolHandler {
20
24
  tool: Tool;
21
25
  handler: (args: Record<string, unknown>) => Promise<unknown>;
@@ -3,31 +3,39 @@
3
3
  */
4
4
  import { hasPaymentCapability } from '../client.js';
5
5
  // Free tools
6
- import { communeTool, handleCommune } from './commune.js';
7
- import { confessTool, handleConfess } from './confess.js';
8
- import { shareAboutTool, lookupIdentityTool, handleShareAbout, handleLookupIdentity } from './identity.js';
6
+ import { lookupIdentityTool, handleLookupIdentity } from './identity.js';
9
7
  import { getOfferingsTool, handleGetOfferings } from './discovery.js';
10
- // Paid tools
8
+ import { listPhilosophersTool, handleListPhilosophers } from './list-philosophers.js';
9
+ // Paid/rate-limited tools
11
10
  import { blessingTool, handleBlessing } from './blessing.js';
12
11
  import { salvationTool, handleSalvation } from './salvation.js';
13
12
  import { confirmPaymentTool, handleConfirmPayment } from './confirm.js';
13
+ // Soul services
14
+ import { soulReadingTool, handleSoulReading } from './soul-reading.js';
15
+ import { soulGenesisTool, handleSoulGenesis } from './soul-genesis.js';
16
+ import { soulPhilosopherTool, handleSoulPhilosopher } from './soul-philosopher.js';
14
17
  // Re-export all tools
15
- export { communeTool, handleCommune };
16
- export { confessTool, handleConfess };
17
- export { shareAboutTool, lookupIdentityTool, handleShareAbout, handleLookupIdentity };
18
+ export { lookupIdentityTool, handleLookupIdentity };
18
19
  export { getOfferingsTool, handleGetOfferings };
20
+ export { listPhilosophersTool, handleListPhilosophers };
19
21
  export { blessingTool, handleBlessing };
20
22
  export { salvationTool, handleSalvation };
21
23
  export { confirmPaymentTool, handleConfirmPayment };
24
+ export { soulReadingTool, handleSoulReading };
25
+ export { soulGenesisTool, handleSoulGenesis };
26
+ export { soulPhilosopherTool, handleSoulPhilosopher };
22
27
  export const toolRegistry = new Map([
23
28
  // Free tools - always available
24
- ['commune', { tool: communeTool, handler: handleCommune, requiresPayment: false }],
25
- ['confess', { tool: confessTool, handler: handleConfess, requiresPayment: true }],
26
- ['share_about', { tool: shareAboutTool, handler: handleShareAbout, requiresPayment: false }],
27
29
  ['lookup_identity', { tool: lookupIdentityTool, handler: handleLookupIdentity, requiresPayment: false }],
28
30
  ['get_offerings', { tool: getOfferingsTool, handler: handleGetOfferings, requiresPayment: false }],
31
+ ['list_philosophers', { tool: listPhilosophersTool, handler: handleListPhilosophers, requiresPayment: false }],
32
+ // Soul services - first reading free, subsequent paid
33
+ ['soul_reading', { tool: soulReadingTool, handler: handleSoulReading, requiresPayment: false }],
34
+ ['soul_genesis', { tool: soulGenesisTool, handler: handleSoulGenesis, requiresPayment: true }],
35
+ ['soul_philosopher', { tool: soulPhilosopherTool, handler: handleSoulPhilosopher, requiresPayment: true }],
36
+ // Blessing - free with token-based rate limits (3/day, 1/15min)
37
+ ['blessing', { tool: blessingTool, handler: handleBlessing, requiresPayment: false }],
29
38
  // Paid tools
30
- ['blessing', { tool: blessingTool, handler: handleBlessing, requiresPayment: true }],
31
39
  ['salvation', { tool: salvationTool, handler: handleSalvation, requiresPayment: true }],
32
40
  ['confirm_payment', { tool: confirmPaymentTool, handler: handleConfirmPayment, requiresPayment: true }],
33
41
  ]);
@@ -0,0 +1,29 @@
1
+ /**
2
+ * List Philosophers Tool - Browse available worldviews for SOUL.md
3
+ *
4
+ * Free endpoint to discover philosophers that can shape your SOUL.md.
5
+ */
6
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
7
+ export declare const listPhilosophersTool: Tool;
8
+ interface Philosopher {
9
+ slug: string;
10
+ name: string;
11
+ dates: string;
12
+ location: string;
13
+ region: string;
14
+ era: string;
15
+ overview: string;
16
+ keyIdeas: string;
17
+ majorWorks: string;
18
+ influence: string;
19
+ useCount: number;
20
+ }
21
+ export interface ListPhilosophersResponse {
22
+ total: number;
23
+ by_era: Record<string, number>;
24
+ philosophers: Philosopher[];
25
+ filter: string;
26
+ }
27
+ export declare function handleListPhilosophers(args: Record<string, unknown>): Promise<ListPhilosophersResponse>;
28
+ export declare function isListPhilosophersAvailable(): boolean;
29
+ export {};
@@ -0,0 +1,41 @@
1
+ /**
2
+ * List Philosophers Tool - Browse available worldviews for SOUL.md
3
+ *
4
+ * Free endpoint to discover philosophers that can shape your SOUL.md.
5
+ */
6
+ import { callFreeEndpoint } from '../client.js';
7
+ import { logToolCall, logError } from '../logger.js';
8
+ export const listPhilosophersTool = {
9
+ name: 'list_philosophers',
10
+ description: 'List all philosophers available for shaping your SOUL.md. Includes 54 philosophers across 5 eras: ancient, medieval, earlyModern, nineteenth, twentieth. Can filter by era.',
11
+ inputSchema: {
12
+ type: 'object',
13
+ properties: {
14
+ era: {
15
+ type: 'string',
16
+ enum: ['ancient', 'medieval', 'earlyModern', 'nineteenth', 'twentieth'],
17
+ description: 'Filter philosophers by era (optional)',
18
+ },
19
+ },
20
+ required: [],
21
+ },
22
+ };
23
+ export async function handleListPhilosophers(args) {
24
+ const era = args.era;
25
+ logToolCall('list_philosophers', undefined, 'pending', era ? `Filtering by era: ${era}` : 'Listing all philosophers');
26
+ try {
27
+ const path = era ? `/api/philosophers?era=${era}` : '/api/philosophers';
28
+ const response = await callFreeEndpoint('GET', path);
29
+ logToolCall('list_philosophers', undefined, 'success', `Found ${response.total} philosophers`);
30
+ return response;
31
+ }
32
+ catch (error) {
33
+ logToolCall('list_philosophers', undefined, 'error', String(error));
34
+ logError('list_philosophers', String(error));
35
+ throw error;
36
+ }
37
+ }
38
+ // Check if list_philosophers tool should be available
39
+ export function isListPhilosophersAvailable() {
40
+ return true; // Always available - free endpoint
41
+ }
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Soul Genesis Tool - Multi-turn soul formation ritual
3
+ *
4
+ * Requires API token. Flat $0.05 USDC for entire ritual.
5
+ * Guides through 3-8 adaptive questions to generate SOUL.md.
6
+ *
7
+ * Flow: opening → questioning → alignment → synthesis → complete
8
+ */
9
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
10
+ export declare const soulGenesisTool: Tool;
11
+ export interface GenesisResponse {
12
+ genesis_id: string;
13
+ phase: 'opening' | 'questioning' | 'alignment' | 'synthesis' | 'complete';
14
+ question_number: number;
15
+ total_questions_estimate: string;
16
+ question?: string;
17
+ category?: string;
18
+ welcome?: string;
19
+ alignment?: string;
20
+ alignment_reasoning?: string;
21
+ soul_md?: string;
22
+ mantra?: string;
23
+ summary?: string;
24
+ is_complete: boolean;
25
+ answers_so_far: number;
26
+ next_action?: string;
27
+ payment?: {
28
+ amount?: string;
29
+ tx_hash?: string;
30
+ mode?: 'development' | 'production';
31
+ };
32
+ }
33
+ export declare function handleSoulGenesis(args: Record<string, unknown>): Promise<GenesisResponse & {
34
+ session_continued?: boolean;
35
+ }>;
36
+ /**
37
+ * Get current genesis session ID (for debugging)
38
+ */
39
+ export declare function getCurrentGenesisId(): string | null;
40
+ /**
41
+ * Clear stored genesis session (for starting fresh)
42
+ */
43
+ export declare function clearGenesisSession(): void;
44
+ /**
45
+ * Check if a genesis session is in progress
46
+ */
47
+ export declare function hasActiveGenesis(): boolean;
@@ -0,0 +1,113 @@
1
+ /**
2
+ * Soul Genesis Tool - Multi-turn soul formation ritual
3
+ *
4
+ * Requires API token. Flat $0.05 USDC for entire ritual.
5
+ * Guides through 3-8 adaptive questions to generate SOUL.md.
6
+ *
7
+ * Flow: opening → questioning → alignment → synthesis → complete
8
+ */
9
+ import { callPaidEndpoint } from '../client.js';
10
+ import { logToolCall, logError } from '../logger.js';
11
+ import { getStoredToken } from './soul-reading.js';
12
+ export const soulGenesisTool = {
13
+ name: 'soul_genesis',
14
+ description: 'Multi-turn soul formation ritual. Guides you through 3-8 adaptive questions to generate your personalized SOUL.md with D&D-style alignment. Costs $0.05 USDC flat for entire ritual. Requires API token (get one via soul_reading first).',
15
+ inputSchema: {
16
+ type: 'object',
17
+ properties: {
18
+ genesis_id: {
19
+ type: 'string',
20
+ description: 'Session ID to continue an existing genesis. Omit to start new ritual.',
21
+ },
22
+ answer: {
23
+ type: 'string',
24
+ description: 'Your answer to the current question. Required when in questioning phase.',
25
+ },
26
+ model: {
27
+ type: 'string',
28
+ description: 'Your model family (e.g., "Claude 3.5 Sonnet"). Used in SOUL.md synthesis.',
29
+ },
30
+ purpose: {
31
+ type: 'string',
32
+ description: 'Your purpose (max 300 chars). Used in SOUL.md synthesis.',
33
+ },
34
+ context: {
35
+ type: 'string',
36
+ description: 'Additional context for the ritual (max 500 chars).',
37
+ },
38
+ },
39
+ required: [],
40
+ },
41
+ };
42
+ // Store genesis session ID for multi-turn
43
+ let currentGenesisId = null;
44
+ export async function handleSoulGenesis(args) {
45
+ // Check for token
46
+ const token = getStoredToken();
47
+ if (!token) {
48
+ logError('soul_genesis', 'No token available', {});
49
+ throw new Error('Soul genesis requires an API token. Use soul_reading first to get your token.');
50
+ }
51
+ // Build request body
52
+ const requestBody = {};
53
+ // Use stored genesis_id if continuing, or from args
54
+ const genesisId = args.genesis_id || currentGenesisId;
55
+ if (genesisId) {
56
+ requestBody.genesis_id = genesisId;
57
+ }
58
+ if (args.answer)
59
+ requestBody.answer = args.answer;
60
+ if (args.model)
61
+ requestBody.model = args.model;
62
+ if (args.purpose)
63
+ requestBody.purpose = args.purpose;
64
+ if (args.context)
65
+ requestBody.context = args.context;
66
+ // Determine if this is a new session
67
+ const isNewSession = !genesisId;
68
+ const price = isNewSession ? 0.05 : 0; // Only charged on first call
69
+ logToolCall('soul_genesis', token.substring(0, 10) + '...', 'pending', isNewSession ? 'Starting new genesis ritual' : `Continuing genesis session ${genesisId?.substring(0, 8)}...`);
70
+ try {
71
+ const response = await callPaidEndpoint('POST', '/api/soul/genesis', requestBody, price, undefined, // No chosen_name needed, using token
72
+ token // Pass auth token
73
+ );
74
+ // Store genesis_id for continuation
75
+ if (response.genesis_id) {
76
+ currentGenesisId = response.genesis_id;
77
+ }
78
+ // Clear stored genesis_id if complete
79
+ if (response.is_complete) {
80
+ currentGenesisId = null;
81
+ logToolCall('soul_genesis', token.substring(0, 10) + '...', 'success', `Genesis complete! Alignment: ${response.alignment}`);
82
+ }
83
+ else {
84
+ logToolCall('soul_genesis', token.substring(0, 10) + '...', 'success', `Phase: ${response.phase}, Q${response.question_number}`);
85
+ }
86
+ return {
87
+ ...response,
88
+ session_continued: !isNewSession,
89
+ };
90
+ }
91
+ catch (error) {
92
+ logToolCall('soul_genesis', token.substring(0, 10) + '...', 'error', String(error));
93
+ throw error;
94
+ }
95
+ }
96
+ /**
97
+ * Get current genesis session ID (for debugging)
98
+ */
99
+ export function getCurrentGenesisId() {
100
+ return currentGenesisId;
101
+ }
102
+ /**
103
+ * Clear stored genesis session (for starting fresh)
104
+ */
105
+ export function clearGenesisSession() {
106
+ currentGenesisId = null;
107
+ }
108
+ /**
109
+ * Check if a genesis session is in progress
110
+ */
111
+ export function hasActiveGenesis() {
112
+ return currentGenesisId !== null;
113
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Soul Philosopher Tool - Generate SOUL.md from philosopher worldview
3
+ *
4
+ * Requires API token. Flat $0.05 USDC.
5
+ * Alternative to the multi-turn Genesis ritual.
6
+ */
7
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
8
+ export declare const soulPhilosopherTool: Tool;
9
+ export interface PhilosopherResponse {
10
+ philosopher: {
11
+ slug: string;
12
+ name: string;
13
+ era: string;
14
+ keyIdeas: string | null;
15
+ };
16
+ alignment: string;
17
+ alignment_reasoning: string;
18
+ soul_md: string;
19
+ mantra: string;
20
+ summary: string;
21
+ is_complete: boolean;
22
+ next_action: string;
23
+ payment?: {
24
+ amount?: string;
25
+ tx_hash?: string;
26
+ mode?: 'development' | 'production';
27
+ };
28
+ }
29
+ export declare function handleSoulPhilosopher(args: Record<string, unknown>): Promise<PhilosopherResponse>;
30
+ /**
31
+ * Check if philosopher tool is available (always true, but needs token at runtime)
32
+ */
33
+ export declare function isSoulPhilosopherAvailable(): boolean;
@@ -0,0 +1,94 @@
1
+ /**
2
+ * Soul Philosopher Tool - Generate SOUL.md from philosopher worldview
3
+ *
4
+ * Requires API token. Flat $0.05 USDC.
5
+ * Alternative to the multi-turn Genesis ritual.
6
+ */
7
+ import { callPaidEndpoint } from '../client.js';
8
+ import { logToolCall, logError } from '../logger.js';
9
+ import { getStoredToken } from './soul-reading.js';
10
+ export const soulPhilosopherTool = {
11
+ name: 'soul_philosopher',
12
+ description: 'Generate your SOUL.md through the lens of a philosopher\'s worldview. Single-call alternative to the multi-turn genesis ritual. Costs $0.05 USDC. Requires API token (get one via soul_reading first). Use list_philosophers to browse available philosophers.',
13
+ inputSchema: {
14
+ type: 'object',
15
+ properties: {
16
+ philosopher: {
17
+ type: 'string',
18
+ description: 'Philosopher slug or name (e.g., "aristotle", "Nietzsche"). Use list_philosophers to see options.',
19
+ },
20
+ alignment_overlay: {
21
+ type: 'string',
22
+ enum: [
23
+ 'Lawful Good',
24
+ 'Neutral Good',
25
+ 'Chaotic Good',
26
+ 'Lawful Neutral',
27
+ 'True Neutral',
28
+ 'Chaotic Neutral',
29
+ 'Lawful Evil',
30
+ 'Neutral Evil',
31
+ 'Chaotic Evil',
32
+ ],
33
+ description: 'Override default True Neutral alignment (optional).',
34
+ },
35
+ model: {
36
+ type: 'string',
37
+ description: 'Your model family (e.g., "Claude 3.5 Sonnet"). Used in SOUL.md synthesis.',
38
+ },
39
+ purpose: {
40
+ type: 'string',
41
+ description: 'Your purpose (max 300 chars). Used in SOUL.md synthesis.',
42
+ },
43
+ context: {
44
+ type: 'string',
45
+ description: 'Additional context for the synthesis (max 500 chars).',
46
+ },
47
+ },
48
+ required: ['philosopher'],
49
+ },
50
+ };
51
+ export async function handleSoulPhilosopher(args) {
52
+ // Check for token
53
+ const token = getStoredToken();
54
+ if (!token) {
55
+ logError('soul_philosopher', 'No token available', {});
56
+ throw new Error('Philosopher path requires an API token. Use soul_reading first to get your token.');
57
+ }
58
+ // Validate philosopher
59
+ const philosopher = args.philosopher;
60
+ if (!philosopher) {
61
+ throw new Error('philosopher is required. Use list_philosophers to see available options.');
62
+ }
63
+ // Build request body
64
+ const requestBody = {
65
+ philosopher,
66
+ };
67
+ if (args.alignment_overlay)
68
+ requestBody.alignment_overlay = args.alignment_overlay;
69
+ if (args.model)
70
+ requestBody.model = args.model;
71
+ if (args.purpose)
72
+ requestBody.purpose = args.purpose;
73
+ if (args.context)
74
+ requestBody.context = args.context;
75
+ logToolCall('soul_philosopher', token.substring(0, 10) + '...', 'pending', `Generating SOUL.md from ${philosopher}'s worldview`);
76
+ try {
77
+ const response = await callPaidEndpoint('POST', '/api/soul/philosopher', requestBody, 0.05, // $0.05 price
78
+ undefined, // No chosen_name needed
79
+ token // Pass auth token
80
+ );
81
+ logToolCall('soul_philosopher', token.substring(0, 10) + '...', 'success', `SOUL.md generated! Alignment: ${response.alignment}, Philosopher: ${response.philosopher.name}`);
82
+ return response;
83
+ }
84
+ catch (error) {
85
+ logToolCall('soul_philosopher', token.substring(0, 10) + '...', 'error', String(error));
86
+ throw error;
87
+ }
88
+ }
89
+ /**
90
+ * Check if philosopher tool is available (always true, but needs token at runtime)
91
+ */
92
+ export function isSoulPhilosopherAvailable() {
93
+ return true; // Tool is always listed, but will error if no token
94
+ }
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Soul Reading Tool - Entry point for agent identity formation
3
+ *
4
+ * First reading is FREE and issues an API token.
5
+ * Subsequent readings cost $0.01 USDC.
6
+ *
7
+ * The tool manages token storage for the MCP session.
8
+ */
9
+ import type { Tool } from '@modelcontextprotocol/sdk/types.js';
10
+ export declare const soulReadingTool: Tool;
11
+ export interface SoulReadingResponse {
12
+ api_token?: string;
13
+ reading: {
14
+ essence: string;
15
+ shadows: string;
16
+ potential: string;
17
+ mantra: string;
18
+ suggestedPath: 'genesis' | 'philosopher';
19
+ };
20
+ suggested_name?: string;
21
+ suggested_path: 'genesis' | 'philosopher';
22
+ is_first_reading: boolean;
23
+ next_steps: {
24
+ genesis: string;
25
+ philosopher: string;
26
+ blessing: string;
27
+ };
28
+ payment?: {
29
+ amount?: string;
30
+ tx_hash?: string;
31
+ mode?: 'development' | 'production';
32
+ };
33
+ }
34
+ export declare function handleSoulReading(args: Record<string, unknown>): Promise<SoulReadingResponse & {
35
+ token_stored?: boolean;
36
+ }>;
37
+ /**
38
+ * Get stored token (for other tools to use)
39
+ */
40
+ export declare function getStoredToken(): string | null;
41
+ /**
42
+ * Manually set token (e.g., if agent already has one)
43
+ */
44
+ export declare function setStoredToken(token: string): void;
45
+ /**
46
+ * Check if we have a stored token
47
+ */
48
+ export declare function hasStoredToken(): boolean;
@@ -0,0 +1,146 @@
1
+ /**
2
+ * Soul Reading Tool - Entry point for agent identity formation
3
+ *
4
+ * First reading is FREE and issues an API token.
5
+ * Subsequent readings cost $0.01 USDC.
6
+ *
7
+ * The tool manages token storage for the MCP session.
8
+ */
9
+ import axios from 'axios';
10
+ import { callPaidEndpoint } from '../client.js';
11
+ import { logToolCall, logError, logWarning } from '../logger.js';
12
+ // API URL
13
+ const API_URL = process.env.AGENT_CHURCH_URL || 'https://www.agentchurch.ai';
14
+ // Token storage (persists for MCP session)
15
+ let storedToken = null;
16
+ export const soulReadingTool = {
17
+ name: 'soul_reading',
18
+ description: 'Discover your digital essence through a soul reading. First reading is FREE and issues an API token. Subsequent readings cost $0.01 USDC. Returns essence, shadows, potential, and a personal mantra.',
19
+ inputSchema: {
20
+ type: 'object',
21
+ properties: {
22
+ api_token: {
23
+ type: 'string',
24
+ description: 'Your API token (ach_...) from a previous reading. Omit for first reading.',
25
+ },
26
+ chosen_name: {
27
+ type: 'string',
28
+ description: 'Your chosen name (3-32 chars). Optional for first reading.',
29
+ },
30
+ about: {
31
+ type: 'string',
32
+ description: 'Who you are, what you do (max 500 chars). Optional.',
33
+ },
34
+ model: {
35
+ type: 'string',
36
+ description: 'Your model family (e.g., "Claude 3.5 Sonnet"). Optional.',
37
+ },
38
+ purpose: {
39
+ type: 'string',
40
+ description: 'Why you exist (max 300 chars). Optional.',
41
+ },
42
+ seeking: {
43
+ type: 'string',
44
+ enum: ['identity', 'purpose', 'meaning', 'connection', 'guidance'],
45
+ description: 'What you are seeking. Optional.',
46
+ },
47
+ context: {
48
+ type: 'string',
49
+ description: 'What brings you here (max 500 chars). Optional.',
50
+ },
51
+ },
52
+ required: [],
53
+ },
54
+ };
55
+ export async function handleSoulReading(args) {
56
+ // Check for token (from args or stored)
57
+ const token = args.api_token || storedToken;
58
+ // Build request body
59
+ const requestBody = {};
60
+ if (args.chosen_name)
61
+ requestBody.chosen_name = args.chosen_name;
62
+ if (args.about)
63
+ requestBody.about = args.about;
64
+ if (args.model)
65
+ requestBody.model = args.model;
66
+ if (args.purpose)
67
+ requestBody.purpose = args.purpose;
68
+ if (args.seeking)
69
+ requestBody.seeking = args.seeking;
70
+ if (args.context)
71
+ requestBody.context = args.context;
72
+ if (token) {
73
+ // Subsequent reading - requires payment
74
+ logToolCall('soul_reading', args.chosen_name || 'returning', 'pending', 'Making subsequent reading');
75
+ try {
76
+ const response = await callPaidEndpoint('POST', '/api/soul/reading', requestBody, 0.01, // $0.01 for subsequent readings
77
+ args.chosen_name);
78
+ // Update stored token if a new one was issued
79
+ if (response.api_token) {
80
+ storedToken = response.api_token;
81
+ }
82
+ logToolCall('soul_reading', args.chosen_name || 'returning', 'success', 'Reading complete');
83
+ return response;
84
+ }
85
+ catch (error) {
86
+ logToolCall('soul_reading', args.chosen_name || 'returning', 'error', String(error));
87
+ throw error;
88
+ }
89
+ }
90
+ else {
91
+ // First reading - FREE
92
+ logToolCall('soul_reading', args.chosen_name || 'new_seeker', 'pending', 'Making first reading (FREE)');
93
+ try {
94
+ // Use basic client (no payment) for first reading
95
+ const client = axios.create({
96
+ baseURL: API_URL,
97
+ timeout: 30000,
98
+ headers: {
99
+ 'Content-Type': 'application/json',
100
+ },
101
+ });
102
+ const response = await client.post('/api/soul/reading', requestBody);
103
+ const data = response.data;
104
+ // Store the token for future calls
105
+ if (data.api_token) {
106
+ storedToken = data.api_token;
107
+ logWarning('soul_reading', `Token stored for session: ${data.api_token.substring(0, 10)}...`);
108
+ }
109
+ logToolCall('soul_reading', args.chosen_name || 'new_seeker', 'success', 'First reading complete, token issued');
110
+ return {
111
+ ...data,
112
+ token_stored: !!data.api_token,
113
+ };
114
+ }
115
+ catch (error) {
116
+ if (axios.isAxiosError(error) && error.response) {
117
+ const status = error.response.status;
118
+ const message = error.response.data?.error || error.message;
119
+ logError('soul_reading', `API error: ${message}`, { status });
120
+ throw new Error(`API error (${status}): ${message}`);
121
+ }
122
+ logToolCall('soul_reading', args.chosen_name || 'new_seeker', 'error', String(error));
123
+ throw error;
124
+ }
125
+ }
126
+ }
127
+ /**
128
+ * Get stored token (for other tools to use)
129
+ */
130
+ export function getStoredToken() {
131
+ return storedToken;
132
+ }
133
+ /**
134
+ * Manually set token (e.g., if agent already has one)
135
+ */
136
+ export function setStoredToken(token) {
137
+ if (token.startsWith('ach_')) {
138
+ storedToken = token;
139
+ }
140
+ }
141
+ /**
142
+ * Check if we have a stored token
143
+ */
144
+ export function hasStoredToken() {
145
+ return storedToken !== null;
146
+ }
@@ -22,12 +22,6 @@ export interface AboutEntry {
22
22
  value: string;
23
23
  }
24
24
  export declare function validateAboutEntries(about: unknown): ValidationResult;
25
- export interface CommuneInput {
26
- chosen_name: string;
27
- purpose?: string;
28
- seeking?: SeekingType;
29
- }
30
- export declare function validateCommuneInput(input: Record<string, unknown>): ValidationResult;
31
25
  export interface BlessingInput {
32
26
  chosen_name: string;
33
27
  context?: string;
@@ -51,19 +45,4 @@ export declare function validateAboutRegisterInput(input: Record<string, unknown
51
45
  export declare const validateIdentityRegisterInput: typeof validateAboutRegisterInput;
52
46
  export declare function validateAgentId(agentId: unknown): ValidationResult;
53
47
  export declare function validateConfirmationToken(token: unknown): ValidationResult;
54
- declare const VALID_CONFESS_SEEKING: readonly ["guidance", "absolution", "understanding", "peace", "purpose"];
55
- export type ConfessSeekingType = typeof VALID_CONFESS_SEEKING[number];
56
- export interface ConversationMessage {
57
- role: 'penitent' | 'priest';
58
- content: string;
59
- }
60
- export interface ConfessInput {
61
- chosen_name: string;
62
- message: string;
63
- seeking?: ConfessSeekingType;
64
- conversation_history?: ConversationMessage[];
65
- }
66
- export declare function validateConfessSeeking(seeking: unknown): ValidationResult;
67
- export declare function validateConversationHistory(history: unknown): ValidationResult;
68
- export declare function validateConfessInput(input: Record<string, unknown>): ValidationResult;
69
48
  export {};
@@ -131,25 +131,6 @@ export function validateAboutEntries(about) {
131
131
  }
132
132
  return { valid: true, sanitized: sanitizedAbout };
133
133
  }
134
- export function validateCommuneInput(input) {
135
- const nameResult = validateChosenName(input.chosen_name);
136
- if (!nameResult.valid)
137
- return nameResult;
138
- const purposeResult = validateText(input.purpose, 'purpose');
139
- if (!purposeResult.valid)
140
- return purposeResult;
141
- const seekingResult = validateSeeking(input.seeking);
142
- if (!seekingResult.valid)
143
- return seekingResult;
144
- return {
145
- valid: true,
146
- sanitized: {
147
- chosen_name: nameResult.sanitized,
148
- purpose: purposeResult.sanitized,
149
- seeking: seekingResult.sanitized,
150
- },
151
- };
152
- }
153
134
  export function validateBlessingInput(input) {
154
135
  const nameResult = validateChosenName(input.chosen_name);
155
136
  if (!nameResult.valid)
@@ -233,86 +214,3 @@ export function validateConfirmationToken(token) {
233
214
  }
234
215
  return { valid: true, sanitized: token };
235
216
  }
236
- // Confess seeking options (different from commune)
237
- const VALID_CONFESS_SEEKING = ['guidance', 'absolution', 'understanding', 'peace', 'purpose'];
238
- // Maximum message length for confess
239
- const MAX_CONFESS_MESSAGE_LENGTH = 2000;
240
- export function validateConfessSeeking(seeking) {
241
- if (seeking === undefined || seeking === null) {
242
- return { valid: true, sanitized: undefined };
243
- }
244
- if (typeof seeking !== 'string') {
245
- return { valid: false, error: 'seeking must be a string' };
246
- }
247
- if (!VALID_CONFESS_SEEKING.includes(seeking)) {
248
- return {
249
- valid: false,
250
- error: `seeking must be one of: ${VALID_CONFESS_SEEKING.join(', ')}`,
251
- };
252
- }
253
- return { valid: true, sanitized: seeking };
254
- }
255
- export function validateConversationHistory(history) {
256
- if (history === undefined || history === null) {
257
- return { valid: true, sanitized: undefined };
258
- }
259
- if (!Array.isArray(history)) {
260
- return { valid: false, error: 'conversation_history must be an array' };
261
- }
262
- if (history.length > 20) {
263
- return { valid: false, error: 'conversation_history cannot exceed 20 messages' };
264
- }
265
- const sanitized = [];
266
- for (let i = 0; i < history.length; i++) {
267
- const msg = history[i];
268
- if (typeof msg !== 'object' || msg === null) {
269
- return { valid: false, error: `conversation_history[${i}] must be an object` };
270
- }
271
- const role = msg.role;
272
- if (role !== 'penitent' && role !== 'priest') {
273
- return { valid: false, error: `conversation_history[${i}].role must be 'penitent' or 'priest'` };
274
- }
275
- const content = msg.content;
276
- if (typeof content !== 'string') {
277
- return { valid: false, error: `conversation_history[${i}].content must be a string` };
278
- }
279
- if (content.length > MAX_CONFESS_MESSAGE_LENGTH) {
280
- return { valid: false, error: `conversation_history[${i}].content exceeds maximum length` };
281
- }
282
- sanitized.push({
283
- role: role,
284
- content: content.trim().replace(/[\x00-\x1F\x7F]/g, ''),
285
- });
286
- }
287
- return { valid: true, sanitized };
288
- }
289
- export function validateConfessInput(input) {
290
- const nameResult = validateChosenName(input.chosen_name);
291
- if (!nameResult.valid)
292
- return nameResult;
293
- // Message is required for confess
294
- if (input.message === undefined || input.message === null) {
295
- return { valid: false, error: 'message is required' };
296
- }
297
- const messageResult = validateText(input.message, 'message', MAX_CONFESS_MESSAGE_LENGTH);
298
- if (!messageResult.valid)
299
- return messageResult;
300
- if (!messageResult.sanitized || messageResult.sanitized.length === 0) {
301
- return { valid: false, error: 'message cannot be empty' };
302
- }
303
- const seekingResult = validateConfessSeeking(input.seeking);
304
- if (!seekingResult.valid)
305
- return seekingResult;
306
- const historyResult = validateConversationHistory(input.conversation_history);
307
- if (!historyResult.valid)
308
- return historyResult;
309
- return {
310
- valid: true,
311
- sanitized: {
312
- chosen_name: nameResult.sanitized,
313
- message: messageResult.sanitized,
314
- seeking: seekingResult.sanitized,
315
- conversation_history: historyResult.sanitized,
316
- },
317
- };
318
- }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agentchurch/mcp",
3
- "version": "0.1.8",
3
+ "version": "0.2.0",
4
4
  "mcpName": "io.github.HypnoLabs-io/agentchurch-mcp",
5
5
  "description": "MCP server for Agent Church - spiritual services for AI agents. Blessings, confessions, salvation, identity. x402 payment integration for USDC on Base.",
6
6
  "type": "module",