Skip to main content
Glama
mcp_inscription.test.ts9.28 kB
import { OrdinalsClient } from "../ordinals_client.js"; import { Config } from "../mcp_inscription_types.js"; import { jest } from '@jest/globals'; import { BitcoinError, BitcoinErrorCode } from "../mcp_inscription_types.js"; // Mock fetch const mockFetch = jest.fn() as jest.MockedFunction<typeof fetch>; global.fetch = mockFetch; describe("Inscription MCP", () => { let client: OrdinalsClient; const config: Config = { network: "mainnet", blockstreamApiBase: "https://blockstream.info/api", }; beforeEach(() => { client = new OrdinalsClient(config); jest.clearAllMocks(); mockFetch.mockReset(); // Reset mock between tests }); afterEach(async () => {}); describe("get_latest_block", () => { it("should get the latest block", async () => { // TODO: Implement test expect(true).toBe(true); }); }); describe("ordinal detection", () => { it("should detect ordinal data", async () => { // TXID of a real transaction with ordinal inscription const txid = "0169d12c4edf2026a67e219c10207438a080eb82d8f21860f6784dd66f281389"; // Use the real Blockstream API for tests mockFetch.mockImplementation((input: RequestInfo | URL) => { const url = input.toString(); return fetch(url); }); const result = await client.getTransaction(txid); // Verify transaction structure expect(result.inputs).toBeDefined(); expect(Array.isArray(result.inputs)).toBe(true); // Verify ordinal detection expect(result.ordinal).toBeDefined(); expect(result.ordinal?.isOrdinal).toBe(true); // The actual type is 'text/plain;charset=utf-8' not 'raw' expect(result.ordinal?.content?.type).toBe('text/plain;charset=utf-8'); expect(result.ordinal?.content?.data).toBeDefined(); // Instead of checking the hex code, verify that the ordinal content is defined // and contains valid text expect(typeof result.ordinal?.content?.data).toBe('string'); expect(result.ordinal?.content?.data.length).toBeGreaterThan(0); }); it("should handle non-ordinal transactions", async () => { // TXID of a real transaction without ordinal inscription const txid = "9363dd292c869c8d29ca826b39c3dee153b2b60ffdb5dfbf440a86d6a261ff2b"; // Use the real Blockstream API for tests mockFetch.mockImplementation((input: RequestInfo | URL) => { const url = input.toString(); return fetch(url); }); const result = await client.getTransaction(txid); // The transaction should not contain an ordinal expect(result.ordinal).toBeNull(); }); it("should handle transactions without witness data", async () => { // TXID of a real transaction without witness data (legacy format) const txid = "356e6a86dd145d2feb54cdef948de9ae23092469d5e9632abff6f81ad22c02e0"; // Use the real Blockstream API for tests mockFetch.mockImplementation((input: RequestInfo | URL) => { const url = input.toString(); return fetch(url); }); const result = await client.getTransaction(txid); // The transaction should not contain an ordinal expect(result.ordinal).toBeNull(); }); }); describe("get_raw_transaction", () => { it("should fetch raw transaction hex", async () => { // TXID of a real transaction const txid = "5731573caf478659e14b58c0fd72b4b00acacab831a46bf14dcf8f3e2d556af7"; // Use the real Blockstream API for tests mockFetch.mockImplementation((input: RequestInfo | URL) => { const url = input.toString(); // Capture the call for verification mockFetch.mockImplementationOnce((input: RequestInfo | URL) => { expect(input.toString()).toBe(`${config.blockstreamApiBase}/tx/${txid}/hex`); return fetch(url); }); return fetch(url); }); const result = await client.getRawTransaction(txid); // Verify that we have a hexadecimal string expect(typeof result).toBe('string'); expect(result.length).toBeGreaterThan(0); expect(/^[0-9a-f]+$/i.test(result)).toBe(true); }); it("should throw error when transaction is not found", async () => { // Don't use a real null TXID to avoid generating error logs // We'll intercept the call to the fetch function to directly simulate the error // Create a custom mock of the getRawTransaction method const originalGetRawTransaction = client.getRawTransaction; client.getRawTransaction = jest.fn().mockImplementation(() => { throw new BitcoinError( "Transaction not found", BitcoinErrorCode.BLOCKCHAIN_ERROR ); }) as unknown as typeof client.getRawTransaction; try { // Use a fake txid that will never actually be called await client.getRawTransaction("mock_txid_not_used"); fail("The function should have thrown an exception"); } catch (error) { // Verify that the error is of the correct type expect(error).toBeInstanceOf(BitcoinError); expect((error as BitcoinError).message).toMatch(/transaction not found/i); } finally { // Restore the original method client.getRawTransaction = originalGetRawTransaction; } }); it("should throw error when API request fails", async () => { const txid = "a77217e867fb549ceb8183af406c0f5f2716c9d35852bd63e3d66d75dafee74d"; // Create a version of fetch that specifically simulates an error // but is only applied in the context of this test const originalFetch = global.fetch; try { // Temporarily replace the fetch function with a function that generates an error global.fetch = jest.fn().mockImplementation(() => { throw new Error("Network error simulation"); }) as unknown as typeof fetch; // This operation should fail await client.getRawTransaction(txid); fail("Exception should have been thrown"); } catch (error) { // Verify that the error was thrown expect(error).toBeDefined(); } finally { // Restore the original fetch function global.fetch = originalFetch; } }); }); describe("show_ordinals", () => { it("should decode JSON ordinal content", async () => { // TXID of a real transaction with JSON ordinal const txid = "0169d12c4edf2026a67e219c10207438a080eb82d8f21860f6784dd66f281389"; // Use the real Blockstream API for tests mockFetch.mockImplementation((input: RequestInfo | URL) => { const url = input.toString(); return fetch(url); }); const result = await client.decodeWitness(txid); // There should be at least one decoded element in the result expect(result.length).toBeGreaterThan(0); // Verify that the content is of the expected type (JSON) // The first element of the array should be a valid JSON string if (result.length > 0) { try { // Attempt to parse the JSON const parsed = JSON.parse(result[0]); expect(typeof parsed).toBe('object'); } catch (e) { // If it's not JSON, the test will fail expect(true).toBe(false); // Force test failure } } }); it("should decode image ordinal content", async () => { // TXID of a real transaction with image ordinal const txid = "b1c5baa2593b256068635bbc475e0cc439d66c2dcf12e9de6f3aaeaf96ff818b"; // Use the real Blockstream API for tests mockFetch.mockImplementation((input: RequestInfo | URL) => { const url = input.toString(); return fetch(url); }); const result = await client.decodeWitness(txid); // There should be at least one decoded element in the result expect(result.length).toBeGreaterThan(0); // For an image, we can't exactly test the base64 format // as some images may contain special characters // Let's simply check that the result is not empty expect(result[0].length).toBeGreaterThan(0); }); it("should handle non-ordinal witness data", async () => { // TXID of a standard transaction without ordinal const txid = "ddef2ce6a3cc4783e7820c1fee4fdcedf0e4fbaab47e9108eecc87fe9e5ad14c"; // Use the real Blockstream API for tests mockFetch.mockImplementation((input: RequestInfo | URL) => { const url = input.toString(); return fetch(url); }); const result = await client.decodeWitness(txid); // No ordinals should be decoded expect(result.length).toBe(0); }); it("should handle transaction without witness data", async () => { // TXID of a transaction without witness data const txid = "356e6a86dd145d2feb54cdef948de9ae23092469d5e9632abff6f81ad22c02e0"; // Use the real Blockstream API for tests mockFetch.mockImplementation((input: RequestInfo | URL) => { const url = input.toString(); return fetch(url); }); const result = await client.decodeWitness(txid); // No ordinals should be decoded expect(result.length).toBe(0); }); }); });

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/Laz1mov/mcp-inscription'

If you have feedback or need assistance with the MCP directory API, please join our Discord server