Skip to main content
Glama
nxGnosis

Travel Agent MCP Server

by nxGnosis

GET_VISA_INFO_BY_COUNTRY

Retrieve visa requirements and immigration details for specific countries to plan international travel with accurate, up-to-date information.

Instructions

Get visa information for a specific country.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
countryCodeYes
currencyCodeNo

Implementation Reference

  • The execute function implementing the core logic of the GET_VISA_INFO_BY_COUNTRY tool. It calls the visaService to fetch data and formats a detailed response with country info, news, FAQ, visa types, etc.
    	execute: async (params: getVisaCountryParam) => {
    		try {
    			const visaInfoResponse = await visaService.getVisaInfoByCountry(
    				params.countryCode,
    				params.currencyCode,
    			);
    
    			let formattedOutput = `๐Ÿ›‚ Visa information for ${params.countryCode}:\n`;
    
    			if (visaInfoResponse && visaInfoResponse.data) {
    				const { visaCountry, visaNews, visaFaq, visaTypes, bookingsCount } = visaInfoResponse.data;
    				
    				// Country Information
    				if (visaCountry) {
    				  formattedOutput += `\n๐ŸŒ Country: ${visaCountry.name} (${visaCountry.country_code})`;
    				  formattedOutput += `\n๐Ÿ“ธ Image: ${visaCountry.image || "N/A"}`;
    				  formattedOutput += `\n๐Ÿ‘ฅ Banned Countries: ${visaCountry.banned?.join(", ") || "None"}`;
    				  formattedOutput += `\nโœˆ๏ธ No Visa Required For: ${visaCountry.no_visa?.join(", ") || "None"}`;
    				  formattedOutput += `\nโš ๏ธ Status: ${visaCountry.status || "N/A"}`;
    				} else {
    				  formattedOutput += "\nNo country details found.";
    				}
    			  
    				// Visa News
    				if (visaNews && visaNews.length > 0) {
    				  formattedOutput += "\n\n๐Ÿ“ฐ Visa News:";
    				  visaNews.forEach((news:any) => {
    					formattedOutput += `\n  - ${news.title || "No title"}: ${news.content || "No content"}`;
    				  });
    				}
    			  
    				// Visa FAQ
    				if (visaFaq && visaFaq.length > 0) {
    				  formattedOutput += "\n\n๐Ÿ“š Visa FAQ:";
    				  visaFaq.forEach((faq:any) => {
    					formattedOutput += `\n  - ๐Ÿ’ฌ Question: ${faq.question || "No question"}`;
    					formattedOutput += `\n    ๐Ÿ’ฌ Answer: ${faq.answer || "No answer"}`;
    				  });
    				}
    			  
    				// Visa Types
    				if (visaTypes && visaTypes.length > 0) {
    				  formattedOutput += "\n\n๐ŸŽŸ๏ธ Visa Types:";
    				  visaTypes.forEach((type:any) => {
    					formattedOutput += `\nVisa Type: ${type.name || "N/A"}`;
    					formattedOutput += `\n๐ŸŒ Country Code: ${type.country_code || "N/A"}`;
    					formattedOutput += `\n#๏ธโƒฃ Base Code: ${type.base_code || "N/A"}`;
    					formattedOutput += `\n๐Ÿ’ฐ Total Price: $${type.total_price || "N/A"}`;
    					formattedOutput += `\n๐Ÿ’ฐ Processing Fee: $${type.processing_fee || "N/A"}`;
    					formattedOutput += `\n๐Ÿ’ฐ Government Fee: $${type.government_fee || "N/A"}`;
    					formattedOutput += `\n๐Ÿ’ผ Entry Type: ${type.entry_type || "N/A"}`;
    					formattedOutput += `\nโฐ Validity Period: ${type.validity_period || "N/A"} days`;
    					formattedOutput += `\nโœ… Status: ${type.status || "N/A"}`;
    			  
    					if (type.keyRequirements && type.keyRequirements.length > 0) {
    					  formattedOutput += "\n๐Ÿ“„ Key Requirements:";
    					  type.keyRequirements.forEach((req:any) => {
    						formattedOutput += `\n  - ${req.requirement || "N/A"}`;
    					  });
    					}
    			  
    					if (type.benefits && type.benefits.length > 0) {
    					  formattedOutput += "\nโญ Benefits:";
    					  type.benefits.forEach((benefit:any) => {
    						formattedOutput += `\n  - ${benefit.benefit || "N/A"}`;
    					  });
    					}
    			  
    					if (type.additionalRequirements && type.additionalRequirements.length > 0) {
    					  formattedOutput += "\nโš ๏ธ Additional Requirements:";
    					  type.additionalRequirements.forEach((additionalRequirement:any) => {
    						formattedOutput += `\n  - ${additionalRequirement.question || "N/A"}`;
    					  });
    					}
    			  
    					formattedOutput += "\n---\n"; // Add separator between visa types
    				  });
    				}
    			  
    				formattedOutput += `\n๐Ÿ›’ Total Bookings: ${bookingsCount || 0}`;
    			  } else {
    				formattedOutput += "Could not retrieve visa information.";
    			  }
    
    			return dedent`${formattedOutput}`;
    		} catch (error) {
    			if (error instanceof Error) {
    				return `Error fetching visa information for ${params.countryCode}: ${error.message}`;
    			}
    			return `An unknown error occurred while fetching visa information for ${params.countryCode}`;
    		}
    	},
    };
  • Zod schema for tool parameters: required countryCode (ISO alpha-3) and optional currencyCode.
    const getVisaCountryParam = z.object({
    	countryCode: z
    		.string()
    		.describe("The ISO 3166-1 alpha-3 country code (e.g., 'USA', 'GHA')."),
    	currencyCode: z
    		.string()
    		.optional()
    		.describe(
    			"Optional currency code for the country, if applicable (e.g., 'USD', 'EUR').",
    		),
    });
  • src/index.ts:14-15 (registration)
    Registration of the GET_VISA_INFO_BY_COUNTRY tool with the FastMCP server.
    // Add Visa tools
    server.addTool(getVisaInfoByCountry);
  • Helper service that fetches visa data from the external API, transforms it, and returns structured data used by the tool handler.
    getVisaInfoByCountry: async (
    	countryCode: string,
    	currencyCode?: string,
    ): Promise<any> => {
    	let url = `${config.visaApi.baseUrl}/visa/country/details/${countryCode}`;
    	if (currencyCode) {
    		url += `?currencyCode=${currencyCode}`;
    	}
    	try {
    		const response = await fetch(url, {
    			headers: {
    				"x-api-key": config.visaApi.apiKey,
    			},
    		});
    		if (!response.ok) {
    			throw new Error(`HTTP error! status: ${response.status}`);
    		}
    		const rawData = await response.json();
    
    		// Transform the raw data into the expected structure
    		const formattedData = {
    			data: {
    				visaCountry: rawData.data?.visaCountry || null, // Assuming rawData.data.visaCountry contains the country details
    				visaNews: rawData.data?.visaNews || [],
    				visaFaq: rawData.data?.visaFaq || [],
    				visaTypes: rawData.data?.visaTypes || [],
    				bookingsCount: rawData.data?.bookingsCount || 0,
    			},
    		};
    		return formattedData;
    	} catch (error) {
    		console.error("Error fetching visa info:", error);
    		throw error;
    	}
    },

Latest Blog Posts

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/nxGnosis/TravelAgentMCP'

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