We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/kuro-tomo/shopify-agentic-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server
import { describe, it, expect } from 'vitest';
import { negotiateCapabilities } from '../../src/ucp/negotiate.js';
import type { AgentProfile, UCPCapability, UCPPaymentHandler } from '../../src/types.js';
const V = '2026-01-11';
function cap(name: string): UCPCapability {
return { name, version: V };
}
const serverCaps: UCPCapability[] = [
cap('dev.ucp.shopping.checkout'),
cap('dev.ucp.shopping.catalog'),
cap('dev.ucp.shopping.order'),
cap('dev.ucp.shopping.fulfillment'),
cap('dev.ucp.shopping.checkout.loyalty'),
cap('dev.ucp.shopping.checkout.subscription'),
];
const serverPaymentHandlers: UCPPaymentHandler[] = [
{ id: 'shopify_payments', type: 'processor_tokenizer' },
{ id: 'ap2_mandate', type: 'mandate' },
];
// ─── Intersection algorithm ───
describe('negotiateCapabilities — intersection', () => {
it('returns only capabilities present in both agent and server', () => {
const agent: AgentProfile = {
profile_url: 'https://agent.example.com/.well-known/ucp',
capabilities: ['dev.ucp.shopping.checkout', 'dev.ucp.shopping.catalog'],
credentials: [],
};
const result = negotiateCapabilities(agent, serverCaps, serverPaymentHandlers);
const names = result.active_capabilities.map((c) => c.name);
expect(names).toContain('dev.ucp.shopping.checkout');
expect(names).toContain('dev.ucp.shopping.catalog');
// Order and fulfillment not requested by agent
expect(names).not.toContain('dev.ucp.shopping.order');
expect(names).not.toContain('dev.ucp.shopping.fulfillment');
});
it('includes extensions when parent is in intersection', () => {
const agent: AgentProfile = {
profile_url: 'https://agent.example.com/.well-known/ucp',
capabilities: [
'dev.ucp.shopping.checkout',
'dev.ucp.shopping.checkout.loyalty',
],
credentials: [],
};
const result = negotiateCapabilities(agent, serverCaps, serverPaymentHandlers);
const names = result.active_capabilities.map((c) => c.name);
expect(names).toContain('dev.ucp.shopping.checkout');
expect(names).toContain('dev.ucp.shopping.checkout.loyalty');
});
it('always includes discounts and shipping options', () => {
const agent: AgentProfile = {
profile_url: 'https://agent.example.com/.well-known/ucp',
capabilities: ['dev.ucp.shopping.checkout'],
credentials: [],
};
const result = negotiateCapabilities(agent, serverCaps, serverPaymentHandlers);
expect(result.available_discounts.length).toBeGreaterThan(0);
expect(result.shipping_options.length).toBeGreaterThan(0);
});
it('passes through server payment handlers', () => {
const agent: AgentProfile = {
profile_url: 'https://agent.example.com/.well-known/ucp',
capabilities: ['dev.ucp.shopping.checkout'],
credentials: [],
};
const result = negotiateCapabilities(agent, serverCaps, serverPaymentHandlers);
expect(result.payment_handlers).toEqual(serverPaymentHandlers);
});
});
// ─── Extension pruning ───
describe('negotiateCapabilities — extension pruning', () => {
it('removes extension when parent is NOT in intersection', () => {
const agent: AgentProfile = {
profile_url: 'https://agent.example.com/.well-known/ucp',
// Agent lists the extension but NOT the parent
capabilities: ['dev.ucp.shopping.checkout.loyalty'],
credentials: [],
};
const result = negotiateCapabilities(agent, serverCaps, serverPaymentHandlers);
const names = result.active_capabilities.map((c) => c.name);
// Extension is pruned because parent "dev.ucp.shopping.checkout" is not in intersection
expect(names).not.toContain('dev.ucp.shopping.checkout.loyalty');
});
it('keeps extension when parent IS in intersection', () => {
const agent: AgentProfile = {
profile_url: 'https://agent.example.com/.well-known/ucp',
capabilities: [
'dev.ucp.shopping.checkout',
'dev.ucp.shopping.checkout.subscription',
],
credentials: [],
};
const result = negotiateCapabilities(agent, serverCaps, serverPaymentHandlers);
const names = result.active_capabilities.map((c) => c.name);
expect(names).toContain('dev.ucp.shopping.checkout');
expect(names).toContain('dev.ucp.shopping.checkout.subscription');
});
});
// ─── Empty agent profile ───
describe('negotiateCapabilities — empty agent profile', () => {
it('returns empty active capabilities when agent has no capabilities', () => {
const agent: AgentProfile = {
profile_url: 'https://agent.example.com/.well-known/ucp',
capabilities: [],
credentials: [],
};
const result = negotiateCapabilities(agent, serverCaps, serverPaymentHandlers);
expect(result.active_capabilities).toHaveLength(0);
});
it('still provides defaults for discounts, shipping, and payment handlers', () => {
const agent: AgentProfile = {
profile_url: 'https://agent.example.com/.well-known/ucp',
capabilities: [],
credentials: [],
};
const result = negotiateCapabilities(agent, serverCaps, serverPaymentHandlers);
expect(result.available_discounts.length).toBeGreaterThan(0);
expect(result.shipping_options.length).toBeGreaterThan(0);
expect(result.payment_handlers).toEqual(serverPaymentHandlers);
});
});