MCP server for Abstract API suite. Comprehensive validation, geolocation, timezone, holidays, exchange rates, and web utilities - all services unified under one API key.
- Email Validation: Syntax, deliverability, disposable detection
- Phone Validation: Format, carrier, country, line type
- IP Geolocation: Location, ISP, timezone, currency, security
- VAT Validation: EU VAT number verification
- Timezone: Convert times, get timezone info, DST support
- Holidays: Public holidays for 200+ countries
- Exchange Rates: 170+ currencies, historical rates
- Company Enrichment: Get company data from domain
- Web Scraping: Extract structured data from web pages
- Screenshots: Generate website screenshots
- Abstract API account (free or paid)
- API key (one key for all services)
ABSTRACT_API_KEY
(required): Your Abstract API key
How to get credentials:
- Go to abstractapi.com
- Sign up or log in
- Go to app.abstractapi.com
- Find your API key in the dashboard
- Copy the key and store as
ABSTRACT_API_KEY
Direct link: https://app.abstractapi.com/
Note: One API key works for all Abstract API services!
Free Tier (per service):
- Email Validation: 100 requests/month
- Phone Validation: 100 requests/month
- IP Geolocation: 20,000 requests/month
- VAT Validation: 100 requests/month
- Timezone: 1,000 requests/month
- Holidays: 1,000 requests/month
- Exchange Rates: 1,000 requests/month
- Company Enrichment: 100 requests/month
- Web Scraping: 100 requests/month
Paid Plans: Unlimited requests based on tier
Validate email address and check deliverability.
Parameters:
email
(string, required): Email address to validate
Example:
result = await validate_email(email="user@example.com")
# Returns:
# {
# "email": "user@example.com",
# "autocorrect": "",
# "deliverability": "DELIVERABLE",
# "quality_score": 0.99,
# "is_valid_format": {
# "value": true,
# "text": "TRUE"
# },
# "is_free_email": {
# "value": false,
# "text": "FALSE"
# },
# "is_disposable_email": {
# "value": false,
# "text": "FALSE"
# },
# "is_role_email": {
# "value": false,
# "text": "FALSE"
# },
# "is_catchall_email": {
# "value": true,
# "text": "TRUE"
# },
# "is_mx_found": {
# "value": true,
# "text": "TRUE"
# },
# "is_smtp_valid": {
# "value": true,
# "text": "TRUE"
# }
# }
Deliverability Scores:
DELIVERABLE
: Email is valid and deliverableUNDELIVERABLE
: Email will bounceRISKY
: Email may bounceUNKNOWN
: Cannot determine deliverability
Use Cases:
- Form validation
- List cleaning
- Fraud prevention
- Bounce reduction
Validate phone number and get carrier info.
Parameters:
phone
(string, required): Phone number to validatecountry_code
(string, optional): ISO 3166-1 alpha-2 country code
Example:
# With country code
result = await validate_phone(
phone="14152007986",
country_code="US"
)
# Without country code (auto-detect)
result = await validate_phone(phone="+14152007986")
# Returns:
# {
# "phone": "14152007986",
# "valid": true,
# "format": {
# "international": "+14152007986",
# "local": "(415) 200-7986"
# },
# "country": {
# "code": "US",
# "name": "United States",
# "prefix": "+1"
# },
# "location": "California",
# "type": "mobile",
# "carrier": "T-Mobile USA, Inc."
# }
Line Types:
mobile
: Mobile phonelandline
: Landline phonevoip
: VoIP numberunknown
: Cannot determine
Use Cases:
- SMS verification
- Contact validation
- Fraud detection
- 2FA setup
Get location data from IP address.
Parameters:
ip_address
(string, required): IP address to geolocatefields
(string, optional): Comma-separated fields to return
Example:
# Full geolocation data
result = await geolocate_ip(ip_address="8.8.8.8")
# Specific fields only
result = await geolocate_ip(
ip_address="8.8.8.8",
fields="city,country,timezone"
)
# Returns:
# {
# "ip_address": "8.8.8.8",
# "city": "Mountain View",
# "city_geoname_id": 5375480,
# "region": "California",
# "region_iso_code": "CA",
# "region_geoname_id": 5332921,
# "postal_code": "94035",
# "country": "United States",
# "country_code": "US",
# "country_geoname_id": 6252001,
# "country_is_eu": false,
# "continent": "North America",
# "continent_code": "NA",
# "continent_geoname_id": 6255149,
# "longitude": -122.0574,
# "latitude": 37.4192,
# "timezone": {
# "name": "America/Los_Angeles",
# "abbreviation": "PST",
# "gmt_offset": -8,
# "current_time": "11:24:07",
# "is_dst": false
# },
# "currency": {
# "currency_name": "USD",
# "currency_code": "USD"
# },
# "connection": {
# "autonomous_system_number": 15169,
# "autonomous_system_organization": "Google LLC",
# "connection_type": "Corporate",
# "isp_name": "Google LLC",
# "organization_name": "Google LLC"
# }
# }
Get detailed IP information (ISP, ASN, etc.).
Parameters:
ip_address
(string, required): IP address to query
Example:
info = await get_ip_info(ip_address="1.1.1.1")
# Returns full geolocation plus ISP details
Detect if IP is from VPN/proxy/datacenter.
Parameters:
ip_address
(string, required): IP address to check
Example:
result = await check_vpn(ip_address="1.1.1.1")
# Returns:
# {
# "security": {
# "is_vpn": false,
# "is_proxy": false,
# "is_tor": false,
# "is_relay": false,
# "is_hosting": true,
# "is_cloud_provider": true
# }
# }
Use Cases:
- Fraud prevention
- Geographic restrictions
- Security monitoring
- Compliance checks
Validate EU VAT numbers.
Parameters:
vat_number
(string, required): VAT number (e.g., "SE556656688001")
Example:
result = await validate_vat(vat_number="SE556656688001")
# Returns:
# {
# "vat_number": "SE556656688001",
# "valid": true,
# "company": {
# "name": "GOOGLE SWEDEN AB",
# "address": "GOOGLE IRLAND LTD, GOOGLE SWEDEN AB, KARLAVÄGEN 100, 115 26, STOCKHOLM"
# },
# "country": {
# "code": "SE",
# "name": "Sweden"
# }
# }
Supported Countries: All EU member states
Use Cases:
- B2B transactions
- Tax compliance
- Invoice validation
- Business verification
Get timezone from location or coordinates.
Parameters:
location
(string, optional): Location namelatitude
(float, optional): Latitude coordinatelongitude
(float, optional): Longitude coordinate
Example:
# By location
result = await get_timezone(location="New York")
# By coordinates
result = await get_timezone(
latitude=40.7128,
longitude=-74.0060
)
# Returns:
# {
# "datetime": "2025-10-08 11:24:07",
# "timezone_name": "America/New_York",
# "timezone_abbreviation": "EDT",
# "timezone_offset": -4,
# "timezone_location": "New York",
# "is_dst": true,
# "requested_location": "New York",
# "latitude": 40.7128,
# "longitude": -74.0060
# }
Convert time between timezones.
Parameters:
base_location
(string, required): Source location/timezonebase_datetime
(string, required): Datetime in ISO 8601 formattarget_location
(string, required): Target location/timezone
Example:
result = await convert_timezone(
base_location="New York",
base_datetime="2025-10-08T12:00:00",
target_location="London"
)
# Returns:
# {
# "base_location": "New York",
# "base_datetime": "2025-10-08 12:00:00",
# "target_location": "London",
# "target_datetime": "2025-10-08 17:00:00",
# "timezone_difference": "+5 hours"
# }
Use Cases:
- Meeting schedulers
- Event coordination
- Travel planning
- Global team management
Get public holidays for a country and year.
Parameters:
country
(string, required): ISO 3166-1 alpha-2 country codeyear
(int, required): Year (e.g., 2025)month
(int, optional): Month (1-12)day
(int, optional): Day (1-31)
Example:
# All holidays for a year
holidays = await get_holidays(country="US", year=2025)
# Holidays for a specific month
holidays = await get_holidays(
country="US",
year=2025,
month=12
)
# Check if specific date is a holiday
holidays = await get_holidays(
country="US",
year=2025,
month=7,
day=4
)
# Returns:
# [
# {
# "name": "Independence Day",
# "name_local": "",
# "language": "",
# "description": "",
# "country": "US",
# "location": "United States",
# "type": "National",
# "date": "07/04/2025",
# "date_year": "2025",
# "date_month": "07",
# "date_day": "04",
# "week_day": "Friday"
# }
# ]
Supported: 200+ countries
Use Cases:
- Delivery planning
- Business hours
- Scheduling systems
- Compliance calendars
Get current currency exchange rates.
Parameters:
base
(string, optional): Base currency code (default: USD)target
(string, optional): Target currency code (returns all if not specified)
Example:
# All rates from USD
rates = await get_exchange_rates(base="USD")
# Specific currency pair
rates = await get_exchange_rates(
base="USD",
target="EUR"
)
# Returns:
# {
# "base": "USD",
# "last_updated": 1728396000,
# "exchange_rates": {
# "EUR": 0.92,
# "GBP": 0.79,
# "JPY": 149.5,
# ...
# }
# }
Convert amount between currencies.
Parameters:
base
(string, required): Base currency codetarget
(string, required): Target currency codeamount
(float, required): Amount to convertdate
(string, optional): Historical date (YYYY-MM-DD)
Example:
# Current rates
result = await convert_currency(
base="USD",
target="EUR",
amount=100.00
)
# Historical rates
result = await convert_currency(
base="USD",
target="EUR",
amount=100.00,
date="2024-01-01"
)
# Returns:
# {
# "base": "USD",
# "target": "EUR",
# "amount": 100.00,
# "converted_amount": 92.00,
# "exchange_rate": 0.92,
# "date": "2025-10-08"
# }
Supported: 170+ currencies
Use Cases:
- E-commerce pricing
- Financial reporting
- Travel budgets
- International invoicing
Get company data from domain name.
Parameters:
domain
(string, required): Company domain
Example:
company = await get_company_info(domain="google.com")
# Returns:
# {
# "name": "Google",
# "domain": "google.com",
# "year_founded": 1998,
# "industry": "Internet",
# "employees_count": 100000,
# "locality": "Mountain View",
# "country": "United States",
# "country_code": "US",
# "linkedin_url": "linkedin.com/company/google"
# }
Use Cases:
- Lead enrichment
- Sales intelligence
- Market research
- Contact discovery
Extract structured data from web pages.
Parameters:
url
(string, required): URL to scraperender_js
(bool, optional): Render JavaScript (default: false)
Example:
# Static content
data = await scrape_url(url="https://example.com")
# JavaScript-rendered content
data = await scrape_url(
url="https://example.com",
render_js=True
)
# Returns:
# {
# "url": "https://example.com",
# "title": "Example Domain",
# "meta": {...},
# "text": "...",
# "html": "...",
# "links": [...]
# }
Generate website screenshot.
Parameters:
url
(string, required): URL to screenshotwidth
(int, optional): Width in pixels (default: 1920)height
(int, optional): Height in pixels (default: 1080)full_page
(bool, optional): Capture full page (default: false)
Example:
screenshot = await generate_screenshot(
url="https://example.com",
width=1920,
height=1080,
full_page=False
)
# Returns image data
Use Cases:
- Website monitoring
- Visual testing
- Documentation
- Archiving
# Validate email
email_result = await validate_email(email="user@example.com")
if email_result["deliverability"] == "DELIVERABLE":
# Validate phone
phone_result = await validate_phone(
phone="+14152007986",
country_code="US"
)
if phone_result["valid"]:
# Continue with registration
pass
# Check email
email = await validate_email(email="user@temp-mail.com")
if email["is_disposable_email"]["value"]:
# Block disposable email
pass
# Check IP
ip = await check_vpn(ip_address="1.2.3.4")
if ip["security"]["is_vpn"] or ip["security"]["is_proxy"]:
# Flag suspicious activity
pass
# Get user's location
location = await geolocate_ip(ip_address="1.2.3.4")
user_currency = location["currency"]["currency_code"]
# Convert price to user's currency
price_usd = 99.99
converted = await convert_currency(
base="USD",
target=user_currency,
amount=price_usd
)
# Display price in user's currency
display_price = converted["converted_amount"]
# Get user's timezone
user_tz = await get_timezone(location="New York")
# Convert meeting time
meeting = await convert_timezone(
base_location="Los Angeles",
base_datetime="2025-10-15T14:00:00",
target_location="New York"
)
# Show meeting time in user's timezone
print(f"Meeting at: {meeting['target_datetime']}")
- Cache results: Many validations can be cached
- Batch validations: Process multiple items efficiently
- Handle errors gracefully: Plan for API failures
- Use specific fields: Request only needed data for IP geolocation
- Monitor usage: Track API calls per service
- Validate inputs: Check format before API calls
- Use country codes: Improves phone validation accuracy
- Historical rates: Use for financial reporting
- Secure API key: Never expose in client-side code
- Test thoroughly: Validate with various inputs
Common errors:
- 401 Unauthorized: Invalid API key
- 402 Payment Required: Quota exceeded
- 400 Bad Request: Invalid parameters
- 404 Not Found: Resource not found
- 429 Too Many Requests: Rate limit exceeded
- 500 Internal Server Error: Service issue